Java&JVM虛擬機模型&類加載機制
一、JVM虛擬機
- JVM虛擬機中的boolean型別
? 雖然Java虛擬機中定義了boolean型別,但是實際上在Oracle JVM虛擬機中使用的是int型別來編譯的,
-
JVM虛擬機模型
如圖所示:


編譯好的class檔案通過類加載將一些資訊存入JVM虛擬機中
在運行時會產生多個執行緒,每一個其中包括三個部分
-
pc regsiter表示注冊表,每一個執行緒都有自己的regsiter,并且在任意時間一個執行緒都只有一個方法在執行,計數器會存盤當前執行緒正在執行的方法的JVM指令地址
-
jvm-Virtual Machine stack:一個Java虛擬機堆疊,每一個虛擬機行程只有一個虛擬機堆疊,并且每一個虛擬機堆疊存放一個frame,每次方法呼叫均會創建一個對應的Frame,方法執行完畢或者例外終止,Frame被銷毀,一個方法A呼叫另一個方法B時,A的frame停止,新的frame被創建賦予B,執行完畢后,把計算結果傳遞給A,A繼續執行,一個JVM堆疊存盤本地變數以及執行部分方法的回傳值,
其中frame中分為4部分:
1.Local Variables:基本資料型別、參考資料型別、方法回傳地址
2.Operand Stack:通過LIFO方式操作資料
3.Dynamic Linking:轉換符號參考到直接參考,例如String str=“China”;其中str屬于符號參考,"China"在字串常量池直接參考
4.Method Invocation Completion
-
JVM-heap是虛擬機中的堆,是一個被虛擬機共享的地方,用于存盤由類產生的物件和陣列區域,在虛擬機啟動時就會創建,heap區域會被gc回收,如果heap不足,會拋出OutOfMemoeryError例外
-
JVM-Method Area:方法區,被所有的虛擬機共享,但是不僅僅存放方法,會存放常量池,類的屬性,方法資料,方法和構造方法的代碼等,在邏輯上也屬于heap
-
jvm-Run-Time Constant Pool:JVM 為每個型別都維護了一個常量池,這是一種運行時資料結構,它可以滿足一般編程一語言常量表的功能,每個運行時常量池都是從方法區分配的,當 JVM 創建類或介面時,會為其創建它的運行時常量池,
-
JVM-native method stack:這一部分由其他語言實作
-
二、類加載
-
虛擬機把描述類的資料從Class 檔案加載到記憶體,并對資料進行校驗、轉換決議和初始化,最終形成可以被虛擬機直接使用的 Java 型別,這就是虛擬機的類加載機制,
-
java類的生命周期
-
加載:加載位元組碼檔案,會產生一個Class物件,作為訪問的入口
類加載會加載3個類別庫
? 首先是加載加載 jre/lib/下面的核心類別庫bootstrap,然后是加載jre/lib/ext下的類別庫extension,最后是加載用戶類 classpath變數定義的目錄application
-
鏈接:確保class檔案中的位元組流包含的資訊符合當前虛擬機的要求,
-
驗證檔案格式,是否是以魔術開頭,驗證元資料,看是否存在父類,繼承鏈是否正確,驗證位元組碼、符號參考是否正確
-
在方法區為變數分配記憶體并設定初始值
-
虛擬機將常量池內的符號參考替換為直接參考的程序,
-
-
初始化:執行類中定義的java代碼,此階段是執行clinit方法的程序,
初始化階段,才真正開始執行類中定義的 Java 程式代碼,此階段是執行 () 方法的程序,
() 方法是由編譯器按陳述句在源檔案中出現的順序,依次自動收集類中的所有類變數的賦值動作和靜態代碼塊中的陳述句合并產生的,(不包括構造器中的陳述句,構造器是初始化物件的,類加載完成后,創建物件時候將呼叫的 () 方法來初始化物件)
-
使用
-
卸載
-
3.雙親委派機制

? 自定義的類加載會向父類進行確認,父類則會繼續向上一級進行確認,之后由最頂端的bootstrap向下依次傳達結果
?
?
?
?
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293278.html
標籤:其他
