java 虛擬機 類加載

 java 虛擬機 類加載

類從被加載到虛擬機內存開始,到卸載出內存爲止,整個生命週期包括:加載、驗證、準備、解析、初始化、使用和卸載。

驗證 、準備、解析 統稱爲連接。

這裏寫圖片描述

解析發生的階段並不固定,它可能發生初始化之後。

虛擬機規範確定了有且只有5種情況,必須進行初始化。

1 遇到字節碼指令new getstatic putstatic invokestatic時必須對進行初始化。這四種字節碼指令產生的場景: 新建一個對象,讀取或者設置一個靜態字段(final 除外),調用一個靜態方法。

2使用java.lang.reflect包的方法進行反射調用時。

3當初始化一個子類時,如果它的父類還沒有初始化,則先對它的父類進行初始化。

4當虛擬機啓東市,用戶需要指定一個要執行的朱類(包含main方法的那個類),虛擬機會先初始化這個主類。

5 當使用jdk1.7 的動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最後的解析結果REF_getStatic REF_putStatic REF_invokeStatic的方法句柄,並且這個房方法句柄所對應的類沒有進行初始化,則需要先觸發其初始化。

下面這三種情況不會觸發相應的類初始化:

1通過子類引用父類的靜態字段,不會導致子類的初始化。
2 通過數組定義引用類,不會導致此類的初始化,因爲此時的字節碼指令是newarray,而newarray不會導致類的初始化。
3調用final修飾的字段,不會導致類的初始化。

接口的加載過程和類加載過程稍有不同,不同之處在於:當一個類在初始化時,要求其父類全部都已經初始化過了,但是一個接口在初始化時,並不要求其父接口全部都初始化完成,只有真正使用到父接口時,纔會初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章