摘要:模板解釋器和字節(jié)碼解釋器差不多,不一樣的地方在于直接把對應(yīng)的指令集轉(zhuǎn)成本地代碼編譯器可以針對熱點代碼優(yōu)化,執(zhí)行開銷較大,但是能夠針對性的優(yōu)化,效率最高垃圾收集器負(fù)責(zé)回收不再使用的對象,釋放和整理內(nèi)存簡稱。
(原發(fā)于知乎, 定期同步至segmentfault, 原文地址:知乎-JVM入門系列-JVM總覽)
Java宣稱Write Once Run Everywhere,這意味著在一個平臺上開發(fā)的java程序可以不加修改的運行在其他平臺上面。能達成這個功能依賴的就是jvm屏蔽了底層的差異。
當(dāng)我們編寫.java文件之后,編譯器會將其編譯成同名的.class文件。class文件是一個字節(jié)碼文件,jvm會加載并且執(zhí)行它,下方就是整體框圖。
(圖片來源:wikipedia-Java virtual machine)
如圖所示,虛擬機主要可以被分為三塊:
類加載系統(tǒng)
運行時數(shù)據(jù)區(qū)
執(zhí)行引擎
類加載系統(tǒng)Class Loader Subsystem
類加載系統(tǒng)負(fù)責(zé)驗證并且加載.class文件,主要可以劃分為三個步驟:
加載(Loading)
鏈接(Linking)
初始化(Initialization)
加載
類文件在這一塊被加載到內(nèi)存中去。類加載器(class loader)可以劃分為Boot Strap class Loader, Extension class Loader, and Application class Loader
Boot Strap class Loader - 加載系統(tǒng)引導(dǎo)類( $JAVA_HOME/jre/lib))
Extension class Loader - 加載拓展類($JAVA_HOME/jre/lib/ext)
Application class Loader - 也被稱為User class loader, 負(fù)責(zé)加載應(yīng)用層級的類
鏈接
Verify - 驗證字節(jié)碼是否正確
Prepare - 在這一步分配靜態(tài)變量并且設(shè)置默認(rèn)值
Resolve - 所有的符號引用都會被替換成指向方法區(qū)的原始引用
初始化
這是類加載的最后一步,所有的靜態(tài)變量都會被賦值。執(zhí)行順序是從上到下的,由父類到子類。
運行時數(shù)據(jù)區(qū) Runtime Data Area
運行時數(shù)據(jù)區(qū)可以劃分為5個區(qū)域
方法區(qū) - 保存類數(shù)據(jù)信息,包括成員信息,父類和接口信息,運行時常量池等,jvm共享
堆區(qū) - 保存所有的對象信息,jvm共享
棧區(qū) - 每個線程獨有自己的棧,生命周期和線程一致
PC寄存器區(qū) - 儲存當(dāng)前執(zhí)行指令的地址,如果執(zhí)行的是是本地方法pc為null
本地方法棧區(qū) - 和棧區(qū)一致,只不過存放的是本地方法信息
執(zhí)行引擎 Execution Engine
執(zhí)行引擎負(fù)責(zé)執(zhí)行代碼,執(zhí)行引擎會依次讀取字節(jié)碼并且按順序執(zhí)行。一般來說可以劃分為如下幾個組件
字節(jié)碼解釋器
字節(jié)碼解釋器(Bytecode Interpreter),就像名字顯示的一樣,是用來執(zhí)行字節(jié)碼。優(yōu)點是執(zhí)行開銷小,缺點是執(zhí)行效率較低。
模板解釋器
和字節(jié)碼解釋器差不多,不一樣的地方在于直接把對應(yīng)的指令集轉(zhuǎn)成本地代碼
JIT編譯器
可以針對熱點代碼優(yōu)化,執(zhí)行開銷較大,但是能夠針對性的優(yōu)化,效率最高
垃圾收集器
負(fù)責(zé)回收不再使用的對象,釋放和整理內(nèi)存
Java Native Interface
Java native interface, 簡稱JNI。暴露了本地方法的接口,使得java可以調(diào)用本地方法
Native Method Libraries
本地方法庫
參考:
Java_virtual_machine
The JVM Architecture Explained
How JVM Works – JVM Architecture?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70277.html
摘要:本文是作者自己對中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...
摘要:用于列舉最近分析過的文件常用功能欄,從左到右依次是概覽類直方圖支配樹查詢線程視圖報告相關(guān)詳細(xì)功能。針對那些占用堆內(nèi)存超過整個堆內(nèi)存大小的組件做一系列的分析,例如保留集合潛在的內(nèi)存浪費問題等其他問題。 上一篇文章MAT入門到精通(一)介紹了MAT的使用場景和基本概念,這篇文章開始介紹MAT的基本功能,后面還有兩篇,一篇是MAT的高級功能,另一篇是MAT實戰(zhàn)案例分析。 三、歡迎頁 使用MA...
摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 3670·2021-09-02 15:11
閱讀 4612·2021-08-16 10:47
閱讀 1571·2019-08-29 18:35
閱讀 3046·2019-08-28 17:54
閱讀 2857·2019-08-26 11:37
閱讀 1511·2019-08-23 16:51
閱讀 1819·2019-08-23 14:36
閱讀 1814·2019-08-23 14:21