亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

面試必問:JVM類加載機制詳細解析

發布時間:2020-07-20 16:02:04 來源:網絡 閱讀:233 作者:架構師追風 欄目:編程語言

前言

在Java面試中,簡歷上有寫JVM(Java虛擬機)相關的東西,JVM的類加載機制基本是面試必問的知識點。

面試必問:JVM類加載機制詳細解析

類的加載和卸載

JVM是虛擬機的一種,它的指令集語言是字節碼,字節碼構成的文件是class文件。平常我們寫的Java文件,需要編譯為class文件才能交給JVM運行。可以這么說:C語言代碼——>二進制文件——>計算機硬件,就相當于Java代碼——>字節碼文件——>JVM。JVM將指定的class文件讀取到內存里,并運行該class文件里的Java程序的過程,就稱之為類的加載;反之,將某個class文件的運行時數據從JVM中移除的過程,就稱之為類的卸載

class文件的運行時數據就是C++對象,也稱為kclass對象,這些運行時數據在JDK7之前是放在永久代(PermGen),JDK8之后則放在元空間(Metaspace)。

面試必問:JVM類加載機制詳細解析

類的生命周期

Java類從被虛擬機加載開始,到卸載出內存為止,它的整個生命周期包括:加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段;其中驗證、準備和解析又統稱為連接(Linking)階段。

面試必問:JVM類加載機制詳細解析

類的加載的時機

虛擬機規范并未嚴格規定類加載的時機,跟具體的JVM虛擬機有關。類加載的最佳時機是解析Java字節碼類文件中常量池符號的時候,Class.forName()、ClassLoader.loadClass()、反射API和JNI_FindClass都可以觸發類加載,Hot JVM自身啟動的時候也會觸發類加載。

通過JVM參數中加 -verbose:class,可以在應用啟動的時候打印類加載的過程,如下圖所示:

面試必問:JVM類加載機制詳細解析

初始化這個階段,JVM虛擬機給出了5種必須對類進行“初始化”的情況

  1. 使用new關鍵字實例化對象的時候、讀取或設置一個類的靜態字段的時候、調用一個類的靜態方法的時候;

  2. 使用java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則要先觸發其初始化;

  3. 當初始化一個類的時候,如果發現其父類還沒有被初始化,則要先初始化其父類;

  4. 當虛擬機啟動時,用戶需要指定一個執行的主類(包含main方法的那個類),則虛擬機會優先初始化這個主類;

  5. 在JDK1.7以后,動態語言支持的時候,如果一個java.lang.invoke.MethodHandle實例最后的結果是要執行第1種情況的操作,則也要進行初始化。

類的卸載時機

類的卸載跟采用的垃圾收集算法有關,在CMS中有兩種方法卸載不必要的類,一種是等到元空間(Metaspace)滿了的時候觸發FGC,另一種是使用跟CMS并發收集算法類似的方式,不過對于元空間的閾值和觸發CMS并發收集的閾值是獨立的。更具體的可以參考之前的文章:CMS學習筆記。在這里,我們只需要記住,JVM中一個類的卸載要滿足下面這3個條件:

  1. 該類所有的實例對象都已被回收;

  2. 該類的類加載器對象已經被回收;

  3. 該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

歡迎大家關注我的公種浩【程序員追風】,文章都會在里面更新,整理的資料也會放在里面。

面試必問:JVM類加載機制詳細解析

類加載器的作用

類的加載是需要類加載器完成的,但是類加載器在JVM中的作用可不止這些。在JVM中,一個類的唯一性是需要這個類本身和類加載一起才能確定的,每個類加載器都有一個獨立的命名空間。

不同的類加載器,即使是同一個類字節碼文件,最后再JVM里的類對象也不是同一個,下面的代碼展示了這個結論:

上述代碼的運行結果是:

面試必問:JVM類加載機制詳細解析

可以看出,代碼中使用自定義類加載器(myLoader)加載的jvm.ClassLoaderTest類和通過應用程序類加載器加載的類不是同一個類。綜上,類加載器在JVM中的作用有:

  1. 將類的字節碼文件從JVM外部加載到內存中

  2. 確定一個類的唯一性

  3. 提供隔離特性,為中間件開發者提供便利,例如Tomcat



最后

歡迎大家一起交流,喜歡文章記得點個贊喲,感謝支持!



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扶绥县| 德江县| 丘北县| 黄骅市| 长葛市| 福安市| 新兴县| 池州市| 都兰县| 固阳县| 正定县| 元谋县| 梅州市| 江阴市| 台中县| 全州县| 曲周县| 阳山县| 柳林县| 冷水江市| 应用必备| 晋中市| 洞头县| 娄底市| 县级市| 江川县| 黔西县| 千阳县| 略阳县| 尼勒克县| 英超| 望都县| 肃南| 景德镇市| 汝州市| 杭锦后旗| 杂多县| 柳州市| 民县| 莎车县| 绥棱县|