類的加載篇

螞蟻金服:
深入分析ClassLoader,雙親委派機制
描述一下 JVM 加載 Class 文件的原理機制?
類加載器的雙親委派模型是什麼?
一面:類加載過程
一面:雙親委派機制及使用原因
 
百度:
類加載的時機
java 類加載過程?
類加載器都有哪些?
簡述 java 類加載機制?
 
騰訊:
JVM中類加載機制,類加載過程,什麼是雙親委派模型?
類加載器有哪些
 
小米:
雙親委派模型介紹一下
 
滴滴:
JVM類加載機制
一面:講一下雙親委派模型,以及其優點
 
字節跳動:
什麼是類加載器,類加載器有哪些?
 
美團:
Java類加載過程
描述一下jvm加載class文件的原理機制
 
京東:
什麼是類的加載?
哪些情況會觸發類的加載?
講一下JVM加載一個類的過程
JVM的類加載機制是什麼?
類加載器的雙親委派模型是什麼?
雙親委派機制可以打破嗎?爲什麼
 
此外:
簡單說說你瞭解的類加載器


 類加載子系統作用

ClassLoader只負責class文件的加載,至於它是否可以運行,則由Execution Engine決定。

類的加載過程

一、加載:
通過一個類的全限定名獲取定義此類的二進制字節流
將這個字節流所代表的靜態存儲結構轉化爲方法區的運行時數據結構
在內存中生成一個代表這個類的java.lang.Class對象,作爲方法區這個類的各種數據的訪問入口
 注意:數組類是如何創建加載的呢?
 
二、鏈接:
驗證(Verify):
目的在於確保Class文件的字節流中包含信息符合當前虛擬機要求,保證被加載類的正確性,不會危害虛擬機自身安全。
主要包括四種驗證,文件格式驗證,元數據驗證,字節碼驗證,符號引用驗證。
準備(Prepare):
爲類變量分配內存並且設置該類變量的默認初始值,即零值。
這裏不包含用final修飾的static,因爲final在編譯的時候就會分配了,準備階段會顯式初始化;
這裏不會爲實例變量分配初始化,類變量會分配在方法區中,而實例變量是會隨着對象一起分配到Java堆中。
見LoadClass.java
解析(Resolve):
將常量池內的符號引用轉換爲直接引用的過程。
事實上,解析操作往往會伴隨着JVM在執行完初始化之後再執行。
符號引用就是一組符號來描述所引用的目標。符號引用的字面量形式明確定義在《java虛擬機規範》的Class文件格式中。
在解析階段,jvm根據字符串的內容找到內存區域中相應的地址,然後把符號引用替換成直接指向目標的指針、句柄、偏移量等,這些直接指向目標的指針、句柄、偏移量就被成爲直接引用。
解析動作主要針對類或接口、字段、類方法、接口方法、方法類型等。對應常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。
見Demo.java
三、初始化:
初始化階段就是執行類構造器方法<clinit>()的過程。
此方法不需定義,是javac編譯器自動收集類中的所有類變量的賦值動作和靜態代碼塊中的語句合併而來。
構造器方法中指令按語句在源文件中出現的順序執行。
<clinit>()不同於類的構造器。(關聯:構造器是虛擬機視角下的<init>())
若該類具有父類,JVM會保證子類的<clinit>()執行前,父類的<clinit>()已經執行完畢。
虛擬機必須保證一個類的<clinit>()方法在多線程下被同步加鎖。
見Clinit.java
 

 


 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章