你對JVM內存結構是否熟悉
JVM內存結構
裝載連接初始化
(
被所有線程共享
a
類加載器加載類時
類的完整有效名
父類的完整有效名(interfaceandjava
類型的修飾符
類型直接接口列表
b
存儲了一個類型所使用的常量所有類型
c
jvm必須在方法區中保存類型的所有域的相關信息以及域的聲明順序
域的相關信息包括
域名
域類型
域修飾符(publicprivateprotectedstaticfinalvolatiletransient…)
d
方法名
方法返回類型
方法參數
方法的修飾符
方法的字節碼(abstractandnative除外)(被PC寄存器指向)
操作數棧和方法棧幀的局部變量區的大小
異常表
e
f
g
h
i
j
ClassLava{
privateintspeed=
voidflow();
}
ClassVolcano{
publicstaticvoidmain(String[]args){
Lavalava=newLava();
lava
}
}
下面我們描述一下main()方法的第一條指令的字節碼是如何被執行的
為了運行這個程序
注意jvm在還沒有加載Lava類的時候就已經開始執行了
main()的第一條指令告知jvm為列在常量池第一項的類分配足夠的內存
jvm使用指向Volcano常量池的指針找到第一項
這個符號引用僅僅是類lava的完整有效名
當jvm發現還沒有加載過一個稱為
jvm於是以一個直接指向方法區lava類的指針替換了常量池第一項的符號引用
jvm終於開始為新的lava對象分配空間了
一旦jvm知道了一個Lava對象所要的空間
當把新生成的lava對象的引用壓到棧中
(
存放運行時所有對象和數組
(
每次啟動一個新的線程
(
總是指向該線程下一步要執行的指令
(
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26823.html