更新時間:2022-12-13 14:51:38 來源:動力節點 瀏覽1245次
Java面試題中被經常問到的問題就是java類加載機制面試題了,或者是讓你通過一個程序員,回答程序的輸出步驟與結果是怎樣的,這些知識點都是與java類加載有關系的,所以我們掌握了java類加載機制面試題能夠讓面試更加的輕松應答:
1.Java什么時候把類加載到內存?
Java虛擬機規范中并沒有進行強制約束,這點可以交給虛擬機的具體實現來自由把握。但是對于初始化階段,虛擬機規范則是嚴格規定了有且只有5種情況必須立即對類進行“初始化”,而加載、驗證、準備自然需要在此之前開始。
1.使用new關鍵字實例化對象的時候、讀取或設置一個類的靜態字段(被final修飾、已在編譯期把結果放入常量池的靜態字段除外)的時候,以及調用一個類的靜態方法的時候
2.使用java.lang.reflect包的方法對類進行反射調用的時候
3.當初始化一個類的時候,如果發現其父類還沒有進行過初始化
4.當虛擬機啟動時,用戶需要指定一個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類。
5.當使用JDK 1.7的動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最后的解析結果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先觸發其初始化。
Java虛擬機有預加載功能。類加載器并不需要等到某個類被"首次主動使用"時再加載它,JVM規范規定JVM可以預測加載某一個類,如果這個類出錯,但是應用程序沒有調用這個類, JVM也不會報錯;如果調用這個類的話,JVM才會報錯。
2.加載階段做了什么?
將類的class文件讀入到內存,并創建一個java.lang.Class對象的過程,具體包括以下三個階段:
3.class文件信息都包括什么?
包括類的版本、字段、方法、接口等描述信息,以及常量池(constant pool table),用于存放編譯器生成的各種字面量(Literal)和符號引用(Symbolic References);每個class文件都有一個class常量池。當java文件被編譯成class文件之后,也就是會生成我上面所說的class常量池。
4.class常量池和運行時常量池區別是什么?
當類加載到內存中后,jvm就會將class常量池中的內容存放到運行時常量池中,運行時常量池每個類都有一個。class常量池中存的是字面量和符號引用,并不是對象的實例,而是對象的符號引用值。而經過解析(resolve)之后,也就是把符號引用替換為直接引用,解析的過程會去查詢全局字符串池,以保證運行時常量池所引用的字符串與全局字符串常量池中所引用的是一致的。
全局字符串池里的內容是在類加載完成,經過驗證,準備階段之后在堆中生成字符串對象實例,然后將該字符串對象實例的引用值存到string pool中(記住:string pool中存的是引用值而不是具體的實例對象,具體的實例對象是在堆中開辟的一塊空間存放的)。
5.驗證階段有什么用?
因為class文件可能會被中途改動,或者來自有惡意的編譯器,因此需要進行驗證,避免非法的class文件危害虛擬機自身的安全。
具體包括以下四個階段:
6.驗證階段必須執行嗎
在生產階段可以考慮關閉 -Xverify:none 以此來縮短類加載時間。
以上就是“Java類加載機制面試題的六個常見問題”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習