簡單的java虛擬機類加載機制介紹
類從被加載到虛擬機內存中開始,到卸載出內存為止,它的整個生命周期包括:加載(Loading)-->>驗證(Verification)-->>準備(Preparation)-->>解析(Resolution)-->>初始化(Initialization)-->>使用(Using)-->>卸載(Unloading)7個階段。
1.加載
1)首先通過一個類的全限定名來獲取此類的二進制字節流。
2)其次將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
3)最後在java堆中生成一個代表這個類的Class對象,作為方法區這些數據的訪問入口。
2.驗證
驗證的目的是為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。
3.準備
1)為類變量分配內存並設置類變量初始值(static修飾的變量)。
2)常量值會被初始為代碼中的指定值,但不包括static final實例變量,static final修飾的實例變量是在類初始化時賦值。類的非常量靜態變量的初始值為默認空值。
4.解析
把類中的符號引用轉換為直接引用
5.初始化
(1)初始化的觸發條件:
1)訪問類或接口的靜態變量,或者對類的靜態變量賦值。
2)創建類的實例,即new一個對象
3)調用類的靜態方法
4)反射(Class.forName(“java.lang.Objectt))
5)子類被初始化
6)指定一個類作為Java虛擬機啟動時的初始化類(含有main方法的啟動類)
(2)初始化的順序
1)靜態變量(非static final變量。包含)被訪問或靜態方法被調用情況:父類的代碼塊-->>父類的靜態變量-->>子類的代碼塊-->>子類的靜態變量-->>子類的靜態方法
2)子類被實例化情況:父類的代碼塊-->>父類的靜態變量-->>子類的代碼塊-->>子類的靜態變量-->>父類構造方法(默認為super())-->>子類構造方法
3)靜態變量只會被初始化一次。
寫給自己的話:關於構造方法,當構造方法中有this()或者super()時,會一直查找至沒有顯示的構造方法調用後再調用隱式的構造方法。
簡單的java虛擬機類加載機制介紹