Java類加載時機

類加載順序

加載 —> 連接(驗證,準備,解析) —> 初始化 —> 使用 —> 卸載;
加載,驗證,準備,初始化,卸載 這五個步驟是確定的,解析階段則不一定,某些情況下它會在初始化後纔開始,主要是爲了支持Java的運行時綁定;

類初始化時機

什麼時候進行類加載的第一階段(加載),JVM規範中並沒有強制約束,這點交給具體的JVM實現來決定。但是對於什麼時候執行類初始化階段,JVM規範做出了嚴格規定,遇到以下五種情況必須初始化類(達到可使用狀態):

  • new一個對象,調用某個類的靜態方法,靜態變量,final static變量除外(編譯時候就把結果放到常量池裏);
  • reflect反射調用;
  • 初始化一個類,父類還沒初始化,會對父類進行初始化;
  • JVM啓動時初始化main主類;
  • methodHandle解析時,對該方法對應的類進行初始化;
被動引用

被動引用的時候是不會進行初始化的,有以下幾種情況:

  • 通過子類調用父類的靜態變量,子類不會被初始化,但會被加載;
  • 創建一個對象的數組,對象不會被初始化,但會被加載;
  • 調用一個類中的常量(final static修飾),該類不會被初始化,也不會被加載;
查看類加載的JVM參數

-XX:+TraceClassLoading

發佈了21 篇原創文章 · 獲贊 13 · 訪問量 8182
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章