jvm的幾個執行時資料區域 轉

2022-09-11 08:03:09 字數 1849 閱讀 7148

**如下:

1 public class test 

10

11 public int add(int a,int b)

14 15 }

jvm例項執行乙個j**a程式,首先需要通過類裝載器子系統把作為程式執行起點的類裝載到記憶體。形成可以被虛擬機器直接使用的j**a型別。在上面的例子中,當test類載入完成時,jvm例項幾個重要的執行時資料區域如下圖1所示:

圖1 幾個重要的執行時資料區域

注意在圖1中,忽略了jvm執行時其它一些細節部分的內容。圖中只顯示**例子密切相關的。在類裝載器載入class檔案到記憶體的過程中,虛擬機會提取其中的型別資訊,並將這些資訊儲存到方法區。並且在堆中生成乙個與類資料存在某種關聯的class物件。這種class物件,在j**a程式中可以通過幾種方式獲取。以string型別為例:

1 string str ="test";

2 class class1 = string.class;

3 class class2 = str.getclass();

4 class class3 = class.forname("j**a.lang.string");

一旦獲取了類所對應的class物件之後,就可以通過反射機制獲得儲存在方法區中類資料相關的資訊。另外在靜態方法需要同步的時候,用的就是靜態方法所在類對應的class物件。

1 public static synchronized void syncmethod(){}
虛擬機器把主類裝載進記憶體後,啟動乙個新執行緒,並且為這個新執行緒分配乙個j**a棧和pc(程式計數器)暫存器。緊接著呼叫test類的main方法,執行**//1、//2、//3。在執行完//3**而又準備執行//4**時,jvm例項幾個重要的執行時資料區域如下圖2所示:

圖2 幾個重要的執行時資料區域

在上圖中pc暫存器test執行緒部分內容,作用可以看做是j**a棧中test執行緒所執行的位元組碼的行號指示器。隨著執行引擎執行j**a程式**//1、//2、//3的位元組碼,行號指示器的值也跟著改變。j**a棧以幀為單位儲存執行緒的執行狀態的。乙個棧幀包含乙個j**a方法的呼叫狀態,它儲存有區域性變數表、操作棧、動態鏈結、方法出口等資訊。圖中只顯示了棧幀中區域性變數表部分內容。對於基本資料型別(int、byte、long等等)是以值的形式儲存在棧幀的區域性變數表中的,如例子中的變數tempa和tempb。而物件的話是以引用的形式儲存。它不等同於物件本身,根據不同的虛擬機器實現,它可能是乙個指向物件起始位址的引用指標,也可能指向乙個代表物件的控制代碼或者其他與此物件相關的位置。總之,根據儲存在區域性變數表部分的物件引用,通過某種方式能找到在堆中與之關聯的物件例項資料。如例子中的test引用。

虛擬機器在執行完j**a**//3後,緊接著執行**//4。在執行add方法的位元組碼之前,先壓入乙個新的棧幀到該執行緒的j**a棧中。當方法返回時,這個棧幀被從j**a棧中彈出並拋棄。當虛擬機器執行到j**a**//6時,jvm例項幾個重要的執行時資料區域如下圖3所示:

圖3 幾個重要的執行時資料區域

當add方法執行完成,成功返回。然後虛擬機器準備執行j**a**//5時,jvm例項幾個重要的執行時資料區域如下圖4所示:

圖4 幾個重要的執行時資料區域

當虛擬機器把最後一行j**a**//5也執行完了,這個虛擬機器例項也就隨之消亡。

JVM執行時資料區

根據 jvm 規範,jvm 記憶體共分為虛擬機器棧 堆 方法區 程式計數器 本地方法棧五個部分。記憶體空間 runtime data area 中可以按照是否執行緒共享分為兩塊,執行緒共享的是方法區 method area 和堆 heap 執行緒獨享的是虛擬機器棧 vm stack 本地方法棧 na...

JVM 執行時資料區

jdk版本 8 class檔案 class content class物件 物件 的含義 class檔案 儲存在磁碟上的.class檔案 十六進製制位元組碼檔案 class content 類載入器子系統載入class檔案,儲存到記憶體中的位元組流,解析前這塊記憶體區域叫class content ...

JVM執行時資料區

1.1.hotspot vm 是之前使用最廣泛的j a虛擬機器,1.2.jrockit vm 是bea 開發的一款虛擬機器是 號稱 執行最快的j a虛擬機器 1.3.j9 vm 是ibm開發的一款虛擬機器 1.4.dalvik vm 是google 開發的一款移動端虛擬機器 1.5 taobaovm...