上圖先

1.1 程序計(jì)數(shù)器
介紹:
程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,它可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。
如果線程正在執(zhí)行JAVA方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址;如果正在執(zhí)行的是Native方法,這個(gè)計(jì)數(shù)器值為空。
問(wèn)題:
此內(nèi)存區(qū)域是唯一一個(gè)沒(méi)有規(guī)定任務(wù)OutOfMemoryError情況的區(qū)域
1.2 JAVA虛擬機(jī)棧?
介紹:
虛擬機(jī)棧描述的是JAVA方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)幀棧用于存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈表,方法出口等信息。
我們平時(shí)所說(shuō)的堆內(nèi)存和棧內(nèi)存指的就是現(xiàn)在講的虛擬機(jī)棧,或者說(shuō)是虛擬機(jī)棧中局部變量表的部分。
問(wèn)題:
這個(gè)區(qū)域規(guī)定了兩種異常狀態(tài):如果線程請(qǐng)求的棧深度大雨虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠內(nèi)存則會(huì)拋出OutOfMemoryError異常。
1.3本地方法棧
介紹:
本地方法棧為Native方法服務(wù)。
問(wèn)題:
和JAVA虛擬機(jī)棧異常相同,會(huì)拋出StackOverflowError異常和OutOfMemoryError異常
1.4 JAVA堆
介紹:
JAVA虛擬機(jī)所管理的內(nèi)存中最大的一塊就是JAVA堆內(nèi)存。JAVA堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)創(chuàng)建啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存唯一目的就是存放對(duì)象實(shí)例。
JAVA堆是垃圾收集器管理的主要區(qū)域,因此很多時(shí)候稱(chēng)為“”GC堆“”
問(wèn)題:
如果在堆內(nèi)存中沒(méi)有內(nèi)存完成實(shí)例分配,并且堆也無(wú)法再擴(kuò)展時(shí),將會(huì)拋出OutOfMemoryError異常。
1.5 方法區(qū)
介紹:
方法區(qū)與JAVA堆一樣,是個(gè)線程共享的內(nèi)存區(qū)域,用于存貯已經(jīng)被加載的類(lèi)信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
問(wèn)題:
當(dāng)方法區(qū)無(wú)法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。
1.6 運(yùn)行時(shí)常量池
介紹:
運(yùn)行時(shí)常量池是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號(hào)引用,這部分內(nèi)容將在類(lèi)加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。
問(wèn)題:
當(dāng)常量池?zé)o法再申請(qǐng)到內(nèi)存時(shí)將拋出OutOfMemoryError異常。
1.7 直接內(nèi)存
介紹:
直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是JAVA虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,但這部分內(nèi)存也被頻繁使用。
問(wèn)題:
服務(wù)器管理員在配置虛擬機(jī)參數(shù)時(shí),會(huì)根據(jù)實(shí)際內(nèi)存設(shè)置-Xmx等參數(shù)信息,但經(jīng)常忽略直接內(nèi)存,使得各個(gè)內(nèi)存區(qū)域總和大于物理內(nèi)存限制(包括物理的和操作系統(tǒng)的限制),從而導(dǎo)致動(dòng)態(tài)擴(kuò)展時(shí)拋出OutOfMemoryError異常。