2020-09-21---第二章--jvm數(shù)據區(qū)域

1.Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內存劃分為若干個不同的數(shù)據區(qū)域。


image.png

程序計數(shù)器:
(1) java多線程中是通過線程切換的來實現(xiàn)的,在切換到下一個線程過程中需要記錄當前線程的正在執(zhí)行的虛擬機字節(jié)碼指令地址(執(zhí)行Native方法時計數(shù)器為Undefined),CPU切換回來時會按照計數(shù)器記錄的行數(shù)繼續(xù)執(zhí)行。
(2) 每一個線程都有自己獨自的程序計數(shù)器、并且是獨享、互不影響的。
(3) 此內存區(qū)域是唯一一個在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

java虛擬機棧
(1)虛擬機棧描述的是Java方法執(zhí)行的內存模型:每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧幀(Stack Frame[插圖])用于存儲局部變量表、操作棧、動態(tài)鏈接、方法出口等信息。每一個方法被調用直至執(zhí)行完成的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。
(2) 在Java虛擬機規(guī)范中,對這個區(qū)域規(guī)定了兩種異常狀況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機??梢詣討B(tài)擴展(當前大部分的Java虛擬機都可動態(tài)擴展,只不過Java虛擬機規(guī)范中也允許固定長度的虛擬機棧),當擴展時無法申請到足夠的內存時會拋出OutOfMemoryError異常。

本地方法棧:
本地方法棧(Native Method Stacks)與虛擬機棧所發(fā)揮的作用是非常相似的,其區(qū)別不過是虛擬機棧為虛擬機執(zhí)行Java方法(也就是字節(jié)碼)服務,而本地方法棧則是為虛擬機使用到的Native方法服務。

java堆:
(1) 對象的實例、數(shù)組都是存儲在此內存區(qū)域。
(2) 它是java垃圾收集器管理的區(qū)域。
(3) 如果在堆中沒有內存完成實例分配,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常。

方法區(qū):
方法區(qū)(Method Area)與Java堆一樣,是各個線程共享的內存區(qū)域,它用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據。當方法區(qū)無法滿足內存分配需求時,將拋出OutOfMemoryError異常。

運行時常量池:
常量池(Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后存放到方法區(qū)的運行時常量池中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容