jvm类加载、初始化
生活随笔
收集整理的這篇文章主要介紹了
jvm类加载、初始化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
1、通過一個類的全限定名來獲取定義此類的二進制字節流;
2、將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構;
3、在java堆中生成一個代表這個類的java.lang.Class對象,作為訪問入口;
這里未限定獲取二進制流的方式,可以通過各種途徑得到,包括jar,war等壓縮包、網絡、運行時生成(動態代理)、數據庫中...等
加載->驗證->準備->(解析->初始化)->使用->卸載
? ?驗證就不說了...
準備:這個階段正式的為類變量分配內存,并設置初始值,內存將分配在方法區中;
必須強調的是這個階段分配的是類的變量(static),不是實例的變量(分配在堆中);
public?static?int?value?=123;
這個階段分配后value?=?0;而不是123;這個階段尚未執行任何java方法。而把value賦值為123的指令putstatic指令是程序被編譯后,存放于類構造器<clinit>()方法中(在初始化階段,并非是實例構造器(構造函數));然而:
public?static?final?int?value?=?123;將會在這個階段設為123(先為0然后是123);
解析:
解析的過程是虛擬機講常量池內的符號引用替換為直接引用的過程;
觸發初始化場景:
1、new關鍵字
2、使用java.lang.reflect,反射調用;
3、main函數,包含main的類;
4、子類被初始化;
不觸發初始化的場景:
1、調用的是父類的靜態域;
2、生命某個類的數組,不會觸發某個類的初始化;
3、調用某個類的靜態字段不會觸發當前類的初始化;
參考:《深入理解java虛擬機》
轉載于:https://my.oschina.net/u/782865/blog/298316
總結
以上是生活随笔為你收集整理的jvm类加载、初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring注解Annotation
- 下一篇: 聚美第七天总结