JVM 執行時資料區

2021-10-20 09:53:09 字數 3181 閱讀 3563

jdk版本:8

「class檔案」、「class content」、「class物件」、"物件"的含義

class檔案:儲存在磁碟上的.class檔案(十六進製制位元組碼檔案)

class content:類載入器子系統載入class檔案,儲存到記憶體中的位元組流,解析前這塊記憶體區域叫class content

class物件:instancemirrorklass型別例項

物件:new出來的例項、newinstance得到的例項

程式計數器

執行緒私有,用來儲存當前執行緒下一條需要執行的位元組碼的索引(如果正在執行的方法是native方法,那麼程式計數器的值為undefined)

虛擬機器棧

public

static

void

main

(string[

] args)

private

static

intadd

(int a,

int b)

執行main方法建立main方法的棧幀

main方法棧幀的區域性變數表記憶體位址賦值給執行緒的區域性變數表指標

main方法棧幀的運算元棧記憶體位址賦值給執行緒的運算元棧指標

開始執行方法內部邏輯(稍後再以位元組碼維度進行分析)

執行add方法

建立add方法的棧幀

main方法下一行位元組碼指令的索引(程式計數器)儲存至add方法棧幀

執行緒的區域性變數表指標儲存至add方法棧幀

執行緒的運算元棧指標儲存至add方法棧幀

add方法棧幀的區域性變數表記憶體位址賦值給執行緒的區域性變數表指標

add方法棧幀的運算元棧記憶體位址賦值給執行緒的運算元棧指標

開始執行方法內部邏輯

位元組碼指令維度分析方法執行

main方法方法體位元組碼指令如下

main方法區域性變數表如下

執行main方法

bipush 10 分析:把int型別數值10壓入運算元棧

istore_1 分析:把運算元棧棧頂的int型別數值(也就是10)賦值給區域性變數表index=1位置的變數(也就是a)

bipush 20 分析:把int型別數值20壓入運算元棧

istore_2 分析:把運算元棧棧頂的int型別數值(也就是20)賦值給區域性變數表index=2位置的變數(也就是b)

iload_1 分析:把區域性變數表index=1位置變數的int型別值(也就是10)壓入運算元棧

iload_2 分析:把區域性變數表index=2位置變數的int型別值(也就是20)壓入運算元棧

istore_3 分析:把方法返回的int型別數值(也就是30)賦值給區域性變數表index=3位置的變數(也就是c)

getstatic #3 分析:獲取靜態變數system.out

iload_3 分析:把區域性變數表index=3位置變數的int型別值(也就是30)壓入運算元棧

invokevirtual #4 分析:呼叫靜態方法printstream.println

return 分析:返回void

add方法方法體位元組碼指令如下

add方法區域性變數表如下

執行add方法

iload_0 分析:把區域性變數表index=0位置變數的int型別值(也就是10)壓入運算元棧

iload_1 分析:把區域性變數表index=1位置變數的int型別值(也就是20)壓入運算元棧

iadd 分析:將運算元棧棧頂兩個int型別數值相加並將結果壓入運算元棧棧頂

ireturn 分析:返回int型別數值

本地方法棧

執行緒私有,執行native方法所使用的區域(jni)

虛擬機器堆

執行緒共享,儲存引用型別物件、stringtable、class物件等

虛擬機器堆劃分為年輕代和年老代,年輕代又劃分為eden區、from區和to區(from區和to區不是絕對的,隨著minorgc的執行會相互切換)

虛擬機器堆記憶體分布比:年輕代1/3,年老代2/3(這個比例不是絕對的,jvm有優化機制)

年輕代記憶體分布比:eden 8/10,from 1/10,to 1/10(這個比例不是絕對的,jvm有優化機制)

設定jvm堆大小

-xmx

-xms

推薦最大值、最小值設定成一樣,佔物理記憶體的1/4(阿里內部推薦)

哪些物件會進入老年代

15次minorgc仍然存活的物件

大物件直接進入老年代:預設超過eden區大小一半的物件為大物件

動態年齡判斷機制:minorgc時如果from區同一年齡的物件已經佔據from區一半以上的空間,那麼此次minorgc eden區存活的物件直接進入老年代

空間擔保機制

每次minorgc之前判斷老年代剩餘可用空間是否大於eden區大小,如果大於,繼續執行minorgc。

如果小於,判斷是否開啟空間擔保,如果未開啟,繼續執行minorgc。

如果開啟,判斷老年代剩餘可用空間是否大於歷代進入老年代物件大小總和的平均數,如果大於,繼續執行minorgc。

如果小於,觸發fullgc。

方法區(元空間)

執行緒共享,儲存類的元資訊、常量、靜態變數、熱點**等資料。

元空間預設大小

最大值:4294901760位元組 ≈ 4g

最小值:21807104位元組 ≈ 20m

設定元空間大小

-xx:maxmetaspacesize

-xx:metaspacesize

推薦最大值、最小值設定成一樣,佔物理記憶體的1/32(阿里內部推薦)

jdk8為什麼用元空間取代永久

JVM執行時資料區

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

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...

JVM執行時資料區 方法區

在hotspot jvm實現當中,在jdk8以前,方法區的實現為permgen,即永久代,主要存放類的資訊,方法的資訊,常量池,靜態變數,符號解析 而jdk8 則去除了permgen,使用元空間metaspace代替,元空間使用的是本地記憶體,理論上可以無限大,最大大小指受限於本地記憶體大小,所以不...