最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

JVM面試總結(二)

2022-04-27 22:25 作者:吾之利劍  | 我要投稿

????JVM是面試必問的模塊,整個JVM我個人感覺可以分為內存模型、類加載機制、GC垃圾回收和性能優(yōu)化四個大塊;

今天主要總結一下類加載機制;

1、介紹一下類加載的過程;*

????一個類型從被加載到虛擬機內存中開始,到卸載出內存為止,它的整個生命周期將依次會經歷加載(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)七個階段,其中驗證、準備、解析三個部分統(tǒng)稱為連接(Linking)。

1、加載

????加載主要是將.class文件(并不一定是.class??梢允荶IP包,網(wǎng)絡中獲?。┲械亩M制字節(jié)流讀入到JVM中。 在加載階段,JVM需要完成3件事: ? ?1、通過類的全限定名獲取該類的二進制字節(jié)流; 2、將字節(jié)流所代表的靜態(tài)存儲結構轉化為方法區(qū)的運行時數(shù)據(jù)結構; 3、在內存中生成一個該類的java.lang.Class對象,作為方法區(qū)這個類的各種數(shù)據(jù)的訪問入口。

2、驗證

????驗證是連接階段的第一步,這一階段的目的是確保Class文件的字節(jié)流中包含的信息符合《Java虛擬機規(guī)范》的全部約束要求,保證這些信息被當作代碼運行后不會危害虛擬機自身的安全。驗證階段大致上會完成下面四個階段的檢驗動作:文件格式驗證、元數(shù)據(jù)驗證、字節(jié)碼驗證和符號引用驗證。

????1、文件格式驗證:

????第一階段要驗證字節(jié)流是否符合Class文件格式的規(guī)范,并且能被當前版本的虛擬機處理。

????2、元數(shù)據(jù)驗證:

????第二階段是對字節(jié)碼描述的信息進行語義分析,以保證其描述的信息符合《Java語言規(guī)范》的要求。

????3、字節(jié)碼驗證:

????第三階段是通過數(shù)據(jù)流分析和控制流分析,確定程序語義是合法的、符合邏輯的。

????4、符號引用驗證:

????符號引用驗證可以看作是對類自身以外(常量池中的各種符號引用)的各類信息進行匹配性校驗,主要看該類是否缺少或者被禁止訪問它依賴的某些外部類、方法、字段等資源。

3、準備

????準備階段是正式為類中定義的變量(即靜態(tài)變量,被static修飾的變量)分配內存并設置類變量初始值的階段。

????主要注意變量在內存中的位置,他們都在方法區(qū),但是JDK8以后一起隨元空間到堆中了

4、 解析

????解析是連接階段的第三步,是虛擬機將常量池內的符號引用替換為直接引用的過程。

5、初始化

????類的初始化階段是類加載過程的最后一步,主要是根據(jù)程序中的賦值語句主動為類變量賦值。

????之前介紹的幾個類加載的動作里,除了在加載階段用戶應用程序可以通過自定義類加載器的方式局部參與外,其余動作都完全由Java虛擬機來主導控制。直到初始化階段,Java虛擬機才真正開始執(zhí)行類中編寫的Java程序代碼,將主導權移交給應用程序。

?????注意:

????1、當有父類且父類為初始化的時候,先去初始化父類;

????2、再進行子類初始化語句。

2、Java什么時候需要對類進行初始化?

????1、遇到new,getstatic,putstatic,或invokestatic這4條字節(jié)碼指令時,如果類沒有進行過初始化,則需要先觸發(fā)其初始化。生成這四條指令單最常見的Java代碼場景是:使用new關鍵字實例化對象的時候,讀取或設置一個類的靜態(tài)字段(被final修飾,已在變異期把結果放入常量池的靜態(tài)字段除外)的時候,以及調用一個類的靜態(tài)方法的時候。

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

????3、當初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進行初始化,則需要先出法其父類的初始化。

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

????5、當使用JDK1.7的動態(tài)語言支持時,如果一個Java.lang.invoke.MethodHandle實例最后的解析結果REF_getStatic,REF_outStatic,REF_invokeStatic的方法句柄,并且這個方法句柄所對應的類沒有進行過初始化,則需要先觸發(fā)其初始化。

3、什么時候不會發(fā)生類的初始化(類的被動引用)

????1、當訪問一個靜態(tài)域時,只有真正聲明這個域的類才會被初始化。如:當通過子類引用父類的靜態(tài)變量,不會導致子類初始化。

????2、通過數(shù)組定義類引用,不會觸發(fā)此類的初始化。

????3、引用常量不會觸發(fā)此類的初始化(常量在鏈接階段就存入調用類的常量池中了)

4、介紹一下對象的實例化過程;*

????對象實例化過程,就是執(zhí)行類構造函數(shù)對應在字節(jié)碼文件中的<init>()方法(實例構造器),<init>()方法由非靜態(tài)變量、非靜態(tài)代碼塊以及對應的構造器組成。

<init>()方法可以重載多個,類有幾個構造器就有幾個<init>()方法;

<init>()方法中的代碼執(zhí)行順序為:父類變量初始化、父類代碼塊、父類構造器、子類變量初始化、子類代碼塊、子類構造器。

執(zhí)行順序依次是 靜態(tài)變量、靜態(tài)代碼塊、普通變量、普通代碼塊、構造器。

具有父類的子類的實例化順序如下

????


5、Java對象創(chuàng)建時機

  1. 使用new關鍵字創(chuàng)建對象

  2. 使用Class類的newInstance方法(反射機制)

  3. 使用Constructor類的newInstance方法(反射機制)

  4. 使用Clone方法創(chuàng)建對象

  5. 使用(反)序列化機制創(chuàng)建對象

6、什么是類加載器 ,有哪些類加載器?

在加載階段:

????類加載器是一段代碼,通過此代碼將類以二進制字節(jié)流的形式讀取到JVM中;

????類加載器通過一個類的全限定名來獲取描述該類的二進制字節(jié)流;

????類加載器實現(xiàn)的功能是即為加載階段獲取二進制字節(jié)流的時候。

JVM提供了以下3種系統(tǒng)的類加載器:

????1、啟動類加載器(Bootstrap ClassLoader): 最頂層的類加載器,負責加載 JAVA_HOME\lib 目錄中的,或通過-Xbootclasspath參數(shù)指定路徑中的,且被虛擬機認可(按文件名識別,如rt.jar)的類。

????2、擴展類加載器(Extension ClassLoader): 負責加載 JAVA_HOME\lib\ext 目錄中的,或通過java.ext.dirs系統(tǒng)變量指定路徑中的類庫。

????3、應用程序類加載器(Application ClassLoader): 也叫做系統(tǒng)類加載器,可以通過getSystemClassLoader()獲取,負責加載用戶路徑(classpath)上的類庫。如果沒有自定義類加載器,一般這個就是默認的類加載器。

類加載器之間的層次關系如下:


7、什么是雙親委派模型,有什么作用?*

????如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去完成加載。

雙親委派模型有兩個好處:

  1. 向上委托給父類加載,父類加載不了再自己加載

  2. 避免重復加載,防止Java核心API被篡改

8、雙親委派機制會被破壞嗎?

????雙親委派機制原則在loadclass()方法中。只需要繞開loadclass()方法中即可。

????1、自定義類加載器 ,重寫loadclass()方法

????2、使用線程上下文類加載器;

????JDBC使用線程上下文加載器打破了雙親委派機制。原因是JDBC只提供了接口,并沒有提供實現(xiàn)。

9、擴展

有時候,面試會圍繞如何破壞雙親委派機制來問 ,如tomcat 為了實現(xiàn)隔離性打破雙親委派機制。

1、 如何自定義自己的類加載器

2、ClassLoader 中 的loadClass()、findClass()、defineClass()區(qū)別?

3、 加載一個類采用Class.forName()和ClassLoader有什么區(qū)別

4、你了解 TomCat的類的加載機制嗎?

5、為什么Tomca要打破雙親委派機制模型?

6、有沒有聽說過熱加載或熱部署,如何自己實現(xiàn)一個熱加載?



????以上內容僅供參考,請合理利用搜索引擎!


JVM面試總結(二)的評論 (共 條)

分享到微博請遵守國家法律
宁阳县| 日照市| 赤峰市| 三原县| 津市市| 绿春县| 新泰市| 泸水县| 包头市| 锦屏县| 赫章县| 凯里市| 喜德县| 龙海市| 新营市| 武义县| 米脂县| 内丘县| 元朗区| 锡林郭勒盟| 鹤岗市| 咸阳市| 双辽市| 泗水县| 普陀区| 南漳县| 保靖县| 大方县| 信阳市| 峨眉山市| 庆元县| 瑞安市| 台北县| 上林县| 迁西县| 贺兰县| 安阳市| 子洲县| 平度市| 饶平县| 紫阳县|