国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java面試相關(guān)——堆和棧-簡書

引言:Java 中的堆和棧 Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。至于“方法區(qū)”(靜態(tài)存儲區(qū)),可以理解為:主要存放靜態(tài)數(shù)據(jù)、全局 static 數(shù)據(jù)和常量。這塊內(nèi)存在程序編譯時就已經(jīng)分配好,并且在程序整個運(yùn)行期間都存在。總的來說:堆和棧針對非靜態(tài)數(shù)據(jù),而方法區(qū)針對靜態(tài)數(shù)據(jù)。

一、堆內(nèi)存和棧內(nèi)存

棧(stack)與堆(heap)都是Java用來在Ram中存放數(shù)據(jù)的地方。與C++不同,Java自動管理?xiàng):投?,程序員不能直接地設(shè)置?;蚨选?/p>

·棧:

o簡單理解:堆棧(stack)是操作系統(tǒng)在建立某個進(jìn)程或者線程(在支持多線程的操作系統(tǒng)中是線程)為這個線程建立的存儲區(qū)域,該區(qū)域具有先進(jìn)后出的特性。

o特點(diǎn):存取速度比堆要快,僅次于直接位于CPU中的寄存器。棧中的數(shù)據(jù)可以共享(意思是:棧中的數(shù)據(jù)可以被多個變量共同引用)。

o缺點(diǎn):存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。

o相關(guān)存放對象:①一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄【例如:在函數(shù)中定義的一些基本類型的變量和對象的引用變量】。②方法的形參 直接在??臻g分配,當(dāng)方法調(diào)用完成后從??臻g回收。

o特殊:①方法的引用參數(shù),在棧空間分配一個地址空間,并指向堆空間的對象區(qū),當(dāng)方法調(diào)用完成后從??臻g回收。②局部變量new出來之后,在??丶投芽臻g中分配空間,當(dāng)局部變量生命周期結(jié)束后,它的??臻g立刻被回收,它的堆空間等待GC回收。

·堆:

o簡單理解:每個Java應(yīng)用都唯一對應(yīng)一個JVM實(shí)例,每一個JVM實(shí)例唯一對應(yīng)一個堆。應(yīng)用程序在運(yùn)行中所創(chuàng)建的所有類實(shí)例或者數(shù)組都放在這個堆中,并由應(yīng)用所有的線程共享。Java中分配堆內(nèi)存是自動初始化的,Java中所有對象的存儲控件都是在堆中分配的,但這些對象的引用則是在棧中分配,也就是一般在建立一個對象時,堆和棧都會分配內(nèi)存。

o特點(diǎn):可以動態(tài)地分配內(nèi)存大小、比較靈活,生存期也不必事先告訴編譯器,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動垃圾回收器來管理。

o缺點(diǎn):由于要在運(yùn)行時動態(tài)分配內(nèi)存,存取速度較慢。

o主要存放:①由new創(chuàng)建的對象和數(shù)組 ;②this

o特殊:引用數(shù)據(jù)類型(需要用new來創(chuàng)建),既在??丶峙湟粋€地址空間,又在堆空間分配對象的類變量。

補(bǔ)充:在堆中產(chǎn)生了一個數(shù)組或?qū)ο蠛螅€可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個變量就成了數(shù)組或?qū)ο蟮囊米兞俊?/p>

引用變量就相當(dāng)于是為數(shù)組或?qū)ο笃鸬囊粋€名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數(shù)組或?qū)ο蟆?/p>

引用變量是普通變量,定義時在棧中分配內(nèi)存,引用變量在程序運(yùn)行到作用域外釋放。而數(shù)組&對象本身在堆中分配,即使程序運(yùn)行到使用new產(chǎn)生數(shù)組和對象的語句所在地代碼塊之外,數(shù)組和對象本身占用的堆內(nèi)存也不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內(nèi)存的主要原因。

這里可以理解為:

String s1 = new String('abc');

這里面:'abc'表示棧中的一個存儲空間中的一個數(shù)據(jù),new String('abc')表示存在于堆中的一個對象,這個對象的值為‘a(chǎn)bc’String s1則表示棧中定義的一個取了new String('abc')在堆中的首地址的一個特殊變量,也就是:s1成了引用變量,相當(dāng)于一個別名。

二、Java數(shù)據(jù)存儲和JVM內(nèi)存分區(qū)

·JAVA中,有六個不同的地方可以存儲數(shù)據(jù):

1.寄存器(register。這是最快的存儲區(qū),因?yàn)樗挥诓煌谄渌鎯^(qū)的地方——處理器內(nèi)部。但是寄存器的數(shù)量極其有限,所以寄存器由編譯器根據(jù)需求進(jìn)行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。

2.堆棧(stack。位于通用RAM中,但通過它的“堆棧指針”可以從處理器哪里獲得支持。堆棧指針若向下移動,則分配新的內(nèi)存;若向上移動,則釋放那些內(nèi)存。這是一種快速有效的分配存儲方法,僅次于寄存器。創(chuàng)建程序時候,JAVA編譯器必須知道存儲在堆棧內(nèi)所有數(shù)據(jù)的確切大小和生命周期,因?yàn)樗仨毶上鄳?yīng)的代碼,以便上下移動堆棧指針。這一約束限制了程序的靈活性,所以雖然某些Java數(shù)據(jù)存儲在堆棧中——特別是對象引用,但是JAVA對象不存儲其中。

3.堆(heap。一種通用性的內(nèi)存池(也存在于RAM中),用于存放所以的JAVA對象。堆不同于堆棧的好處是:編譯器不需要知道要從堆里分配多少存儲區(qū)域,也不必知道存儲的數(shù)據(jù)在堆里存活多長時間。因此,在堆里分配存儲有很大的靈活性。當(dāng)你需要創(chuàng)建一個對象的時候

,只需要new寫一行簡單的代碼,當(dāng)執(zhí)行這行代碼時,會自動在堆里進(jìn)行存儲分配。當(dāng)然,為這種靈活性必須要付出相應(yīng)的代碼。用堆進(jìn)行存儲分配比用堆棧進(jìn)行存儲存儲需要更多的時間。

4.靜態(tài)存儲(static storage。這里的“靜態(tài)”是指“在固定的位置”。靜態(tài)存儲里存放程序運(yùn)行時一直存在的數(shù)據(jù)。你可用關(guān)鍵字static來標(biāo)識一個對象的特定元素是靜態(tài)的,但JAVA對象本身從來不會存放在靜態(tài)存儲空間里。

5.常量存儲(constant storage。常量值通常直接存放在程序代碼內(nèi)部,這樣做是安全的,因?yàn)樗鼈冇肋h(yuǎn)不會被改變。有時,在嵌入式系統(tǒng)中,常量本身會和其他部分分割離開,所以在這種情況下,可以選擇將其放在ROM中 。

6.RAM存儲。如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制,在程序沒有運(yùn)行時也可以存在。

就速度來說,有如下關(guān)系:

寄存器 < 堆棧="">< 堆=""><>

·JVM的內(nèi)存分區(qū):

JVM的分區(qū)可分為三個:堆(heap)、棧(stack)和方法區(qū)(method)

1.堆區(qū):

o存儲的全是對象,每個對象都包含一個與之對應(yīng)的class信息(我們常說的類類型,Clazz.getClass()等方式獲?。琧lass目的是得到操作指令。

oJVM只有一個堆區(qū)(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身?!具@里的‘對象’,就不包括基本數(shù)據(jù)類型】

4.棧區(qū):

o每個線程包含自己的一個棧區(qū),棧中只保存基本數(shù)據(jù)類型的對象和自定義對象的引用。

o每個棧中的數(shù)據(jù)(基本類型和對象引用)都是私有的,其他棧不可訪問。

o棧 = 基本類型變量區(qū) + 執(zhí)行環(huán)境上下文 + 操作指令區(qū)(存放操作指令)

8.方法區(qū)【這個可能比較陌生】

o又稱為‘靜態(tài)區(qū)’,和堆一樣,被所有的線程共享。

o方法區(qū)包含所有的class和static變量。

補(bǔ)充:大家也許聽說過“數(shù)據(jù)區(qū)”或者“運(yùn)行時數(shù)據(jù)區(qū)”這個名詞,這里,我們說JVM是驅(qū)動Java程序運(yùn)行的基礎(chǔ),而它有三個分區(qū):堆、棧、方法區(qū),實(shí)際上,JVM的三個方法區(qū)就是包含于 JVM的運(yùn)行時數(shù)據(jù)區(qū)中的三大塊。于是,“數(shù)據(jù)區(qū)”與上述的分區(qū)的關(guān)系就明朗了。

三、Java的兩種數(shù)據(jù)類型:

1.基本類型(primitive types), 共有8種,即int, short, long, byte, float, double, boolean, char(注意,

并沒有string的基本類型)。這種類型的定義是通過諸如int a = 3; long b = 255L;的形式來定義的,稱為自動變量。【自動變量存的是字面值,不是類的實(shí)例(即不是類的引用),這里并沒有類的存在,如int a=3;
這里a只是指向int類型(不是類)的引用,指向字面值3,此時,由于這些字面值的數(shù)據(jù)大小可知并且生存期可知(他們在程序內(nèi)某個固定代碼塊中,代碼塊退出,他們就消失),為了追求速度,于是存在中】

2.包裝類,如Integer, String, Double等將相應(yīng)的基本數(shù)據(jù)類型包裝起來的類。這些類數(shù)據(jù)全部存在于中,Java用new()語句來顯式地告訴編譯器,在運(yùn)行時才根據(jù)需要動態(tài)創(chuàng)建,因此比較靈活,但缺點(diǎn)是要占用更多的時間。

視頻資料鏈接:

data:text/html;charset=UTF-8;base64,

5oGt5Zac5L2g77yM5p625p6E5biI5a2m5Lmg576k5Y+35pivNTc1NzUxODU0Cg==

復(fù)制粘貼在網(wǎng)站打開即可

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中堆內(nèi)存和棧內(nèi)存詳解
Java中堆內(nèi)存與棧內(nèi)存分配淺析
JAVA虛擬機(jī)內(nèi)存分配與回收機(jī)制(轉(zhuǎn))
java堆內(nèi)存和棧內(nèi)存
堆和棧的概念和區(qū)別
JVM從零學(xué)習(xí)(三)虛擬機(jī)棧
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服