更新時間:2023-02-03 11:23:09 來源:動力節點 瀏覽1391次
Java編程最大的特點就是與平臺的無關性,使用Java虛擬機來實現這一點是最關鍵的,所以我們在面試相關崗位的時候,JVM的相關面試題經常被問到,今天小編就總結了一些比較有代表性的問題,希望可以在就業上給予大家一些幫助:
1、Class.forName 和 ClassLoader.loadClass 都能加載類,這兩者在加載類時的區別?
Class.forName()方法實際上也是調用的CLassLoader來實現的。
Class.forName(String className);這個方法的源碼是:
@CallerSensitive public static Class forName(String className) throws ClassNotFoundException { Class caller = Reflection.getCallerClass(); return forName0(className, true, ClassLoader.getClassLoader(caller), caller); }
最后調用的方法是forName0這個方法,在這個forName0方法中的第二個參數被默認設置為了true,這個參數代表是否對加載的類進行初始化,設置為true時會類進行初始化,代表會執行類中的靜態代碼塊,以及對靜態變量的賦值等操作。Class.forName加載類是將類進了初始化,而ClassLoader的loadClass并沒有對類進行初始化,只是把類加載到了虛擬機中
2、什么叫類加載器
虛擬機把描述類的數據文件(字節碼)加載到內存,并對數據進行驗證、準備、解析以及類初始化,最終形成可以被虛擬機直接使用的java類型(java.lang.Class對象)。
3、類的生命周期
加載過程:通過一個類的全限定名來獲取定義此類的二進制字節流,將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。在內存中(方法區)生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口;
找到類文件(通過類的全限定名來獲取定義此類的二進制字節流)
放入方法區(將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構)
開個入口(生成一個代表此類的java.lang.Class對象,作為訪問方法區這些數據結構的入口)
驗證過程:為了確保Class文件的字節流中包含的信息符合當前虛擬機的要求,文件格式驗證、元數據驗證、字節碼驗證、符號引用驗證
準備過程:正式為類屬性分配內存并設置類屬性初始值的階段,這些內存都將在方法區中進行分配
解析階段:虛擬機將常量池內的符號引用替換為直接引用的過程
初始化階段:類初始化階段是類加載過程的最后一步。初始化階段就是執行類構造器()方法的過程
使用階段:
卸載階段:
4、類加載器
類加載器負責加載所有的類,同一個類(一個類用其全限定類名(包名加類名)標志)只會被加載一次。
雙親委派模型的工作過程
雙親委托機制的作用
如何打破雙親委派模型?
打破雙親委派
“雙親委派”機制只是Java推薦的機制,并不是強制的機制。
比如JDBC就打破了雙親委派機制。它通過Thread.currentThread().getContextClassLoader()得到線程上下文加載器來加載Driver實現類,從而打破了雙親委派機制。
自定義ClassLoader
5、引起類加載操作的五個行為
遇到new、getstatic、putstatic或invokestatic這四條字節碼指令
反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化
子類初始化的時候,如果其父類還沒初始化,則需先觸發其父類的初始化
虛擬機執行主類的時候(有 main(string[] args))
JDK1.7 動態語言支持
以上就是“比較代表性的jvm加載器面試題及答案”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習