一、JVM jdk1.8之前
structure.png
二拟淮、JVM JDK1.8
structure8.png
三狗超、類加載及生命周期
虛擬機將類的描述文件class 文件加載到內存并進行安全校驗弹澎、數據類型解析、內存分配以及初始化努咐、最終形成可以被虛擬機直接使用的java類型苦蒿,這個過程就是虛擬機的類加載機制。與解釋執(zhí)行的語言不同渗稍,java語言是編譯型語言佩迟,類型的連接是在程序運行期進行的,可以動態(tài)加載一下內容竿屹,增加了靈活性报强。
java虛擬機規(guī)范里,沒有強制規(guī)定類加載時機羔沙,需要具體虛擬機自由實現(xiàn)躺涝。但對初始化階段有嚴格規(guī)定:
- 遇到new厨钻、putstatic及invokestatic 4條指令代碼是扼雏,如果沒有初始化,立即進行初始化夯膀。
- 使用reflect包的方法對類進行反射的時候诗充,沒有則進行初始化
- 初始化類的時候,發(fā)現(xiàn)父類沒有初始化
- 虛擬機啟動诱建,需要啟動主類初始化蝴蜓。
-
使用動態(tài)語言時,如果java.lang.invoke.MethodHandle實例最終的解析結果是REF_getstatic俺猿、REF_putStatic茎匠、REF_invokeStatic句柄時且句柄沒有初始化時。
classLoad.png
加載
加載階段虛擬機要完成三件事情
- 根據類的全限定名獲取定義此類的二進制字節(jié)流押袍;
- 將字節(jié)流代表的靜態(tài)存儲結構轉換為方法去的運行是數據結構诵冒;
- 在方法區(qū)中為這個類生成一個java.lang.CLass 對象,作為方法區(qū)這個類的訪問入口
驗證
持續(xù)時間最長的階段谊惭,文件格式驗證汽馋、元數據驗證、字節(jié)碼驗證圈盔、符號引用驗證豹芯。
準備
為類變量分配內存并設置初始化值(不是代碼定義的值,final除外)的階段驱敲,使用內存在方法區(qū)铁蹈。
解析
將符號引用轉化為直接引用的過程。
四众眨、實例化
newInstance.png