經過一個類的全限定名獲取定義此類的二進制字節流java
將這個字節流所表明的靜態存儲結構轉化爲方法去的運行時數據結構安全
在內存中生成一個表明這個類的java.lang.Class對象,做爲方法區這個類的各類數據的訪問入口數據結構
目的在於確保class文件的字節流中包含的信息符合當前虛擬機的要求,保證被加載類的正確性,不會危害虛擬機自身安全。多線程
主要包括四種驗證: 文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證線程
爲變量分配內存並設置該類變量的默認值,即零值,類變量會分配在方法區中。code
這裏不包含用final修飾的static,由於final在編譯的時候就已經分配了,準備階段會顯示初始化。對象
這裏不會爲實例變量分配初始化,實例變量會隨着對象一塊兒分配到java堆中內存
將常量池的符號引用轉化爲直接引用的過程編譯器
事實上,解析操做每每會伴隨着JVM在執行完初始化以後再執行同步
初始化階段就是執行類構造器方法<clinit>()的過程
此方法不須要定義,是javac編譯器自動收集類中的全部類變量的賦值動做
和靜態代碼塊中的語句
合併而來。
<clinit>()不一樣於類的構造器。( 構造器是虛擬機視角下的<init>() )
若該類具備父類,JVM會保證自雷的<clinit>() 執行前,父類的<clinit>() 已經執行完畢
虛擬機必須保證一個類 的<clinit>() 方法在多線程下被同步加鎖
參考資料: 《深刻理解java虛擬機 第三版》 周志明