jvm類加載、初始化


jvm類加載
一、經過一個類的全限定名來獲取定義此類的二進制字節流;
二、將這個字節流所表明的靜態存儲結構轉化爲方法區的運行時數據結構;
三、在java堆中生成一個表明這個類的java.lang.Class對象,做爲訪問入口;
這裏未限定獲取二進制流的方式,能夠經過各類途徑獲得,包括jar,war等壓縮包、網絡、運行時生成(動態代理)、數據庫中...等
加載->驗證->準備->(解析->初始化)->使用->卸載

   驗證就不說了...java

準備:
這個階段正式的爲類變量分配內存,並設置初始值,內存將分配在方法區中;
必須強調的是這個階段分配的是類的變量(static),不是實例的變量(分配在堆中);
public static int value =123;
這個階段分配後value = 0;而不是123;這個階段還沒有執行任何java方法。而把value賦值爲123的指令putstatic指令是程序被編譯後,存放於類構造器<clinit>()方法中(在初始化階段,並不是是實例構造器(構造函數));然而:
public static final int value = 123;將會在這個階段設爲123(先爲0而後是123);
解析:
解析的過程是虛擬機講常量池內的符號引用替換爲直接引用的過程;
觸發初始化場景:
一、new關鍵字
二、使用java.lang.reflect,反射調用;
三、main函數,包含main的類;
四、子類被初始化;
不觸發初始化的場景:
一、調用的是父類的靜態域;
二、生命某個類的數組,不會觸發某個類的初始化;
三、調用某個類的靜態字段不會觸發當前類的初始化;



參考:《深刻理解java虛擬機》數據庫

相關文章
相關標籤/搜索