轉自:
http://www.java265.com/JavaCourse/202204/2708.html
下文筆者將簡介JVM 將class檔案加載到記憶體的整個程序簡介說明,如下所示:
類加載的程序主要分為三個部分: 加載,鏈接,初始化 而鏈接又可以細分為三個小部分: 驗證,準備,決議
加載
加載:將class位元組碼檔案從各個來源通過類加載器裝載入記憶體中 將class檔案位元組碼內容加載到記憶體中 并將這些靜態資料轉換成方法區中的運行時資料結構 在堆中生成一個代表這個類的java.lang.Class物件 作為方法區類資料的訪問入口
鏈接
將java類的二進制代碼合并到jvm的運行狀態之中的程序
驗證
確保加載的類資訊符合jvm規范,沒有安全方面的問題, 對于檔案格式的驗證,比如常量中是否有不被支持的常量?檔案中是否有不規范的或者附加的其他資訊? 對于元資料的驗證,比如該類是否繼承了被final修飾的類?類中的欄位,方法是否與父類沖突?是否出現了不合理的多載? 對于位元組碼的驗證,保證程式語意的合理性,比如要保證型別轉換的合理性, 對于符號參考的驗證,比如校驗符號參考中通過全限定名是否能夠找到對應的類?校驗符號參考中的訪問性(private,public等)是否可被當前類訪問?
準備
正式為類變數(static變數)分配記憶體并設定類變數初始值的階段,這些記憶體都將在方法區中進行分配 特別需要注意,初值,不是代碼中具體寫的初始化的值,而是Java虛擬機根據不同變數型別的默認初始值 比如8種基本型別的初值,默認為0;參考型別的初值則為null;常量的初值即為代碼中設定的值,final static tmp = 456, 那么該階段tmp的初值就是456
決議
虛擬機常量池內的符號參考替換為直接參考的程序 (如String s ="java265",轉化為 s的地址指向"java265"的地址)
初始化
此階段主要是對類變數初始化,執行類構造器的程序 (只對static修飾的變數或陳述句進行初始化) 當初始化一個類的時候,其父類尚未初始化,則優先初始化其父類 當同時包含多個靜態變數和靜態代碼塊,則按照自上而下的順序依次執行 當訪問一個java類的靜態域時,只有真正宣告這個靜態變數的類才會被初始化
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/500239.html
標籤:Java
