大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 職業指南 比較代表性的jvm加載器面試題及答案

比較代表性的jvm加載器面試題及答案

更新時間:2023-02-03 11:23:09 來源:動力節點 瀏覽1391次

Java編程最大的特點就是與平臺的無關性,使用Java虛擬機來實現這一點是最關鍵的,所以我們在面試相關崗位的時候,JVM的相關面試題經常被問到,今天小編就總結了一些比較有代表性的問題,希望可以在就業上給予大家一些幫助:

jvm加載器面試題及答案

1、Class.forName 和 ClassLoader.loadClass 都能加載類,這兩者在加載類時的區別?

  • Class.forName有重載方法可以指定是否需要初始化,而默認的方法初始化設置為true這會初始化類執行鏈接和初始化操作
  • ClasaLoader是有類加載器的loadClass方法加載,傳入的是false,只會執行連接操作,不會初始化操作

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、類加載器

類加載器負責加載所有的類,同一個類(一個類用其全限定類名(包名加類名)標志)只會被加載一次。

  1. Bootstrap ClassLoader:根類加載器,負責加載java的核心類,它不是java.lang.ClassLoader的子類,而是由JVM自身實現
  2. Extension ClassLoader:擴展類加載器,擴展類加載器的加載路徑是JDK目錄下jre/lib/ext,擴展類的getParent()方法返回null,實際上擴展類加載器的父類加載器是根加載器,只是根加載器并不是Java實現的
  3. Application ClassLoader:應用程序類加載器,它負責在JVM啟動時加載來自java命令的-classpath選項、java.class.path系統屬性或CLASSPATH環境變量所指定的jar包和類路徑。程序可以通過getSystemClassLoader()來獲取系統類加載器。系統加載器的加載路徑是程序運行的當前路徑。

雙親委派模型的工作過程

  1. 先查找當前ClassLoader是否加載過此類,有就返回;
  2. 如果沒有,查詢父ClassLoader是否已經加載過此類,如果已經加載過,就直接返回Parent加載的類;
  3. 如果整個類加載器體系上的ClassLoader都沒有加載過,才由當前ClassLoader加載(調用findClass),整個過程類似循環鏈表一樣。

雙親委托機制的作用

  1. 共享功能:可以避免重復加載,當父親已經加載了該類的時候,子類不需要再次加載,一些Framework層級的類一旦被頂層的ClassLoader加載過就緩存在內存里面,以后任何地方用到都不需要重新加載。
  2. 隔離功能:java核心類庫的純凈和安全,防止惡意加載。

如何打破雙親委派模型?

  1. 雙親委派模型的邏輯都在loadClass()中,重寫loaderClass()、findClass()
  2. 系統自帶的三個類加載器都加載特定目錄下的類,如果我們自己的類加載器放在一個特殊的目錄,那么系統的加載器就無法加載,也就是最終還是由我們自己的加載器加載

打破雙親委派

“雙親委派”機制只是Java推薦的機制,并不是強制的機制。

比如JDBC就打破了雙親委派機制。它通過Thread.currentThread().getContextClassLoader()得到線程上下文加載器來加載Driver實現類,從而打破了雙親委派機制。

自定義ClassLoader

  1. loadClass(String name,boolean resolve):根據指定的二進制名稱加載類
  2. findClass(String name): 根據二進制名稱來查找類
  3. 直接使用或繼承已有的ClassLoader實現:java.net.URLClassLoader、java.security.SecureClassLoader、 java.rmi.server.RMIClassLoader
  4. 在調用loadClass(),會先根據委派模型在父加載器中加載,如果加載失敗,則會調用自己的findClass方法來完成加載

5、引起類加載操作的五個行為

遇到new、getstatic、putstatic或invokestatic這四條字節碼指令

反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化

子類初始化的時候,如果其父類還沒初始化,則需先觸發其父類的初始化

虛擬機執行主類的時候(有 main(string[] args))

JDK1.7 動態語言支持

以上就是“比較代表性的jvm加載器面試題及答案”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产臀控福利视频在线 | 久久精品亚洲乱码伦伦中文 | 久久国产麻豆 | 国产在线精品一区二区高清不卡 | 久久综合久久网 | 色综合久久中文字幕综合网 | 色播久久 | 99久久精品无码一区二区毛片 | 国产一区二区三区播放 | 亚洲精品欧美日韩 | 777午夜精品被窝影院 | 五月婷婷激情综合 | 久久99精品久久久久久水蜜桃 | a级毛片免费 | 欧美日韩国产欧美 | 亚洲国产清纯 | 色婷婷中文字幕 | 精品99视频 | 日日爱影院 | 精品一区二区三区免费视频 | 欧美 日韩 中文字幕 | xxx毛片| 欧美v亚洲v国产v | 一级毛片在线观看免费 | 男女免费视频 | 精品国产香蕉 | 色婷婷视频在线观看 | 久久久久久一级毛片免费无遮挡 | 国产精品中文字幕在线观看 | 国产精品a人片在线观看 | 国产成人精品免费久久久久 | 欧美特级毛片a够爽 | 免费aⅴ在线| 一级免费大片 | 国内精品久久久久久久久久久久 | 爱综合网| 欧美vs日韩vs国产在线观看 | 久久精品国产eeuss | 久久这里只有精品1 | 天天操天天射天天爽 | 日本综合在线 |