您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關深入淺析JVM的結構體系,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
JVM 是一種抽象的計算機,基于堆棧架構,它有自己的指令集和內存管理,是 Java 跨平臺的依據,JVM解釋執行字節碼,或將字節碼編譯成本地代碼執行。Java 虛擬機體系結構如下:
Class File
Class File 是平臺無關的二進制文件,包含著能被JVM執行的字節碼,其中多字節采用大端序,字符使用一種改進的UTF-8編碼。Class文件精確的描述了一個類或接口的信息,其中包括:
Class Loader
類加載器,JVM在類首次使用時動態的加載、鏈接和初始化。JVM默認的加載模型是雙親委派模型,類加載器之間存在父子關系的層次結構,內部使用組合實現。此外還有其他的加載方式,比如Servlet加載,它先嘗試自己加載,不成功再委派上層加載器,類隔離;OSGI加載器之間是一種網狀的依賴關系,沒有上下層的區分,比較靈活。
加載
加載就是將Class文件表示的類或接口,在JVM方法區中創建一個與之對應的java.lang.Class對象,像Class.forName()、ClassLoader.loadClass()、反射都能觸發類加載。當觸發一個類加載時,詳細的過程如下:
當ClassLoader在classpath中未找到類文件,會拋出ClassNotFoundException;當類A引用類B,類A已經成功加載,但是加載B時未找到類文件,會拋出NoClassDefFoundError。JVM有以下幾種類加載器:
鏈接
初始化
執行類初始化方法,即賦值靜態字段,執行靜態塊,順序按照其定義的先后。父類的靜態域會先于子類靜態域初始化。
至此,一個類或接口被加載到了內存中,JVM會保證整個過程是線程安全的。需要注意的是整個過程沒有涉及到任何實例對象。
運行時數據區
1. Method Area:線程共享,存儲運行時常量池、類字段和方法信息、靜態變量和方法的字節碼,是堆的邏輯組成部分,這部分的垃圾回收是可選的。值得一提的是Hotspot JVM自JDK8之后,調整了這部分內存的內容,class meta-data的分配使用本地內存,interned String和類靜態變量移動到了Java堆。
2. 運行時常量池:對于JVM來說具有核心作用,基本上涉及到方法或字段,JVM就會在運行時常量池中搜索其具體的內存地址。
3. Heap:線程共享,存儲實例對象,實例變量以及數組,是垃圾回收的主要區域。
4. JVM Stack:線程私有,用于存儲棧幀,當方法被調用時會創建一個棧幀入棧,棧幀由以下幾部分組成:
5. PC Register:線程私有,保存當前指令地址,執行后指向下一條指令地址。
6. Native Method Stack:線程私有,存儲本地方法信息,C或C++棧。
執行引擎
讀取、翻譯、執行字節碼。JVM基于棧架構,這個棧就是操作數棧,字節碼指令就是通過它進行各種運算。此外還有基于寄存器的虛擬機。
本地方法接口和庫
JNI,調用本地方法,c/c++庫;執行引擎所需的本地方法庫。
小結
主流JVM的實現有Oracle的Hotspot JVM、JRockit以及IBM的JVM。說到JVM調優,默認指的就是Hotspot VM,足見其流行程度。如今搞Java不去了解JVM就顯得有點low了-v-。
要想寫出高質量代碼,不僅要了解JVM,像調優,問題排查等都需要完備的計算機基礎知識,其實無論用什么語言開發,都是一個構建和完善自身計算機知識體系的過程。
看完上述內容,你們對深入淺析JVM的結構體系有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。