java虛擬機(jī)所管理的內(nèi)存會(huì)包括以下幾個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)域(如圖)
方法區(qū)、堆签则、本地庫(kù)接口 由所有線程共享數(shù)據(jù)區(qū)
虛擬機(jī)棧须床、本地方法棧、程序計(jì)數(shù)器線程隔離數(shù)據(jù)區(qū)(線程私有的內(nèi)存)
名詞解釋
1 程序計(jì)數(shù)器
它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器怀愧,是一塊較小的內(nèi)存空間侨颈;
字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令;
在任何一個(gè)確定的時(shí)刻芯义,一個(gè)處理器(多核來(lái)說(shuō)是一個(gè)核)都只會(huì)執(zhí)行一條線程中的指令哈垢,每個(gè)線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器;
線程正在執(zhí)行一個(gè)java方法扛拨,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址耘分,
如果正在執(zhí)行的是Native方法,這個(gè)計(jì)數(shù)器值為空绑警。
2 JAVA虛擬機(jī)棧
它描述的是java 方法 執(zhí)行的內(nèi)存模型求泰,生命周期與線程相同
每個(gè) 方法 在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ) 局部變量表、操作數(shù)棧计盒、動(dòng)態(tài)鏈接渴频、方法出口等信息,每一個(gè)方法從調(diào)用直至執(zhí)行完成的過(guò)程北启,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程卜朗;
如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度拔第,將拋出StackOverflowError異常,如果虛擬機(jī)棧動(dòng)態(tài)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存场钉,將拋出OutOfMemoryError異常蚊俺。
3 本地方法棧
和虛擬機(jī)棧所發(fā)揮的作用是非常相似的,區(qū)別就是虛擬機(jī)棧為虛擬機(jī)執(zhí)行JAVA方法服務(wù)逛万,而本地方法棧為虛擬機(jī)使用到的Native方法服務(wù)泳猬;
與虛擬機(jī)棧 一樣,也會(huì)拋出?StackOverflowError和OutOfMemoryError 異常宇植。
4 JAVA堆(Java Heap)
是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊得封,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。
所有的對(duì)象實(shí)例以及數(shù)組都要在堆上分配当纱,此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例呛每;
無(wú)論如何劃分,都與內(nèi)容無(wú)關(guān)坡氯,存儲(chǔ)的都仍然是對(duì)象實(shí)例;
如果在堆中沒(méi)有內(nèi)存完成實(shí)例分配洋腮,并且堆也無(wú)法再擴(kuò)展時(shí)箫柳,將拋出OutOfMemoryError異常。
5 方法區(qū)
它用于存儲(chǔ)已被虛擬機(jī)加載的 類信息啥供、常量悯恍、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)伙狐;
有人更愿意稱其為 永久代涮毫;
這區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類型的卸載;
當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分配需求時(shí)贷屎,將拋出OutOfMemoryError異常罢防。
5.1 運(yùn)行時(shí)常量池
是方法區(qū)的一部分,Class文件中有一項(xiàng)信息是常量池唉侄,用于存放編譯期生成的各種字面量和符號(hào)引用咒吐,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放;
除了保存Class文件中描述的符號(hào)引用外属划,還會(huì)把翻譯出來(lái)的直接引用頁(yè)存儲(chǔ)在運(yùn)行時(shí)常量中恬叹;
還具備動(dòng)態(tài)性,運(yùn)行期間也可能將新的常量放入池中同眯,用的比較多的便是String的intern()方法绽昼;
是方法區(qū)的一部分,自然受到方法區(qū)內(nèi)存的限制须蜗,當(dāng)無(wú)法再申請(qǐng)到內(nèi)存是會(huì)拋出OutOfMemoryError異常硅确。