Java 虛擬機類加載機制
個人覺得要弄清楚虛擬機類加載機制,可以從如下兩個方面去了解:
1.什么是類加載機制及虛擬機加載類的時機。
2.加載過程。
首先看看第一個:虛擬機把描述類的數據從class文件加載到內存,并對class文件的合法性進行驗證,引用轉換及解析,最終形成可以被虛擬機使用的Java 類型,這就是虛擬機的類加載機制。
由于java的動態擴展特點(就是可以在運行期指定具體類型),所以java的類加載過程都是在程序運行期完成。
2.虛擬機整個的加載過程可以分為7個階段:加載-》驗證-》準備-》解析-》初始化-》使用-》卸載。
1.加載,這個過程虛擬機并沒有明確規定何時進行,但是規定了只有以下四種情況必須立即進行加載。
1)遇到new,getstatic,putstatic,invokestatic四條指令的時候,對應的場景:使用new關鍵字,讀取或設置一個類的靜態字段(final 靜態字段除外),以及調用類的靜態方法的時候。
2)使用reflect包的方法進行類的反射調用的時候。
3)當初始化一個類的時候,如果他的父類沒有初始化,則先要觸發父類的初始化。(注意這里是父類,如果是父接口的話,是不會觸發父接口初始化成員變量的操作的,除非子類有引用父接口的變量)
4)虛擬機啟動時,虛擬機會首先加載用戶指定的一個要執行的主類(包含main方法的)
注:以上稱為主動引用。有些情況是不會觸發類的加載和初始化的。如:通過子類引用父類的靜態字段,不會觸發子類初始化;通過數組定義來引用類,不會觸發此類的初始化;調用常量不會觸發定義常量的類的初始化。
在確定了什么時候會觸發加載操作后,再來看看加載過程主要做些什么:
1》。通過類的全限定名來獲取定義此類的二進制字節流。這個過程涉及到類加載器的過程,將在后面具體在寫。
2》。將這個字節流所代表的靜態存儲結構轉化為方法區中的運行時數據結構。方法區的數據結構每個虛擬機實現都可以不一樣。
3》。在java堆中生成一個代表這個類的java.lang.Class對象,作為方法區這些數據的外部訪問入口。
第一步到此就完成了。后面會繼續介紹第二階段 驗證。
本文由用戶
openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!