深入Java虛擬機-讀書筆記一Java運行時數(shù)據(jù)區(qū)域和對象創(chuàng)建和訪問

深入Java虛擬機-讀書筆記一Java運行時數(shù)據(jù)區(qū)域和對象創(chuàng)建和訪問

Java運行時數(shù)據(jù)區(qū)域

Java虛擬機在執(zhí)行程序時把它所管理的內(nèi)存劃分為若干不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的用戶,以及創(chuàng)建和銷毀的時間。如下圖


1.png

程序計數(shù)器

一塊較小的內(nèi)存空間,可以看作是當前線程所執(zhí)行的字節(jié)碼的行號指示器。由于Java虛擬機的多線程是通過線程輪流切換并分配處理器執(zhí)行時間的方式來實現(xiàn),在任何一個確定的時刻,一個處理器都只會執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復到正確的執(zhí)行位置,每條線程都需要一個獨立的計數(shù)器,因此屬于線程私有的內(nèi)存。

如果線程正在執(zhí)行一個Java方法,這個計數(shù)器記錄的是正在執(zhí)行的虛擬機字節(jié)碼指令的地址,如果正在執(zhí)行的是Native方法,這個計數(shù)器的值為空。

Java虛擬機棧

也是線程私有的,生命周期與線程相同。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法執(zhí)行的同時都會創(chuàng)建一個棧幀用于存儲局部變量表,操作數(shù)棧,動態(tài)鏈接,方法出口等信息。每個方法從調(diào)用值至執(zhí)行完成的過程,就對應著一個棧幀在虛擬機中入棧和出棧的過程。

本地方法棧

和Java虛擬機棧作用相似,為虛擬機使用的Native方法服務

Java堆

堆是所有線程共享的一塊內(nèi)存區(qū)域。存放幾乎所有對象的實例。幾乎所有的對象實例以及數(shù)組都在堆上分配。

方法區(qū)

各個線程共享的內(nèi)存區(qū)域,用于存儲以及被虛擬機加載的類信息,常量,靜態(tài)變量,及時編譯器編譯后的代碼等數(shù)據(jù)。

運行時常量池

是方法區(qū)的一部分。Class文件中除了類的信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后進入方法區(qū)的運行時常量池中存放

對象的創(chuàng)建

虛擬機遇到一條new指令時,首先會檢查這個指令的參數(shù)是否能在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載,解析,和初始化過。如果沒有,則先執(zhí)行類的加載過程。
類加載完成后,為對象在Java堆中分配一塊內(nèi)存。內(nèi)存分配完成后,虛擬機需要將分配到的內(nèi)存空間都初始化為零值。這步操作保證了對象的實例字段在Java代碼中可以不賦初始值就直接使用。
操作完這步后,<init>方法還沒有執(zhí)行,所有的字段還為零。一般來說,執(zhí)行new指令后會接著執(zhí)行<init>方法,把對象按照程序員的意愿進行初始化

對象的訪問定位

創(chuàng)建對象后如何使用對象,我們的Java程序需要通過棧上的reference數(shù)據(jù)來操作堆上的具體對象,由于reference類型在虛擬機規(guī)范中只規(guī)定了一個指向?qū)ο蟮囊?,因此如何訪問堆中的對象的具體位置,也是取決于虛擬機實現(xiàn)而定.目前主流的訪問方式有使用句柄和直接指針兩種

使用句柄,Java堆中劃分一塊內(nèi)存來作為句柄池,reference中存儲的就是對象的句柄地址,句柄中包含了對象的實例數(shù)據(jù)與類型數(shù)據(jù)各自的具體地址信息.

2.png

直接指針訪問,那么Java堆對象的布局中就必須考慮如何放置訪問類型數(shù)據(jù)的相關信息,而reference中存儲的直接就是對象地址

3.png

使用句柄來訪問的最大好處就是reference中存儲的是穩(wěn)定的句柄地址,在對象被移動時(垃圾收集時移動對象是非常普遍的行為)只會改變句柄中的實例數(shù)據(jù)指針,而reference本身不需要修改

使用直接指針訪問的最大好處就是速度更快,它節(jié)省了一個指針定位的時間開銷,由于對象的訪問在Java中非常頻繁,因此這類開銷成本也非??捎^

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

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容