溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JVM的原理是什么

發(fā)布時(shí)間:2022-01-14 10:44:21 來源:億速云 閱讀:130 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要為大家展示了“JVM的原理是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JVM的原理是什么”這篇文章吧。

一.JVM的原理

Java虛擬機(jī)是Java平臺的基石,解決了硬件和操作系統(tǒng)的相互獨(dú)立性。不同平臺(Windows,Linux和MacOS)的JVM都是不同的,但是他們都提供了相同的接口。虛擬機(jī)可以分為系統(tǒng)虛擬機(jī)和程序虛擬機(jī)。系統(tǒng)虛擬機(jī)就是VMware和VirtualBox這一類的,完全是對物理資源的隔離。而Java虛擬機(jī)是程序虛擬機(jī),它包含了一組指令集并在運(yùn)行時(shí)操作各個(gè)不同內(nèi)存區(qū)域,這些指令在JVM中稱為Java字節(jié)碼指令。

JVM的原理是什么

二.JVM的結(jié)構(gòu)

JVM的基本結(jié)構(gòu)如下圖所示:

JVM的原理是什么

圖中的Java文件泛指所有構(gòu)建在Java虛擬機(jī)上的編程語言文件,如Groovy, Scala, Kotlin等。JVM不和上述任何語言關(guān)聯(lián),而是使用javac把這些語言編譯為“Class文件”的這種二進(jìn)制格式。Class文件中包含了JVM指令集和符號表已經(jīng)其他一些信息。

2.1 類加載子系統(tǒng)

負(fù)責(zé)從class字節(jié)碼文件中并存放在方法區(qū)的內(nèi)存中,并對數(shù)據(jù)進(jìn)行校驗(yàn),轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型。

2.2 執(zhí)行引擎

負(fù)責(zé)執(zhí)行虛擬機(jī)的字節(jié)碼,JVM制定了自己的指令集和體系結(jié)構(gòu),輸入字節(jié)碼文件并輸出執(zhí)行結(jié)果。

2.3 程序計(jì)數(shù)器

是一塊較小的內(nèi)存空間,可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器,每個(gè)線程都有一個(gè)獨(dú)立的程序計(jì)數(shù)器。在虛擬機(jī)概念模型中,字節(jié)碼解釋器工作時(shí)就是通過改變計(jì)數(shù)器的值來選取下一條待執(zhí)行的指令。當(dāng)發(fā)生CPU時(shí)間片切換的時(shí)候,由程序計(jì)數(shù)器來確保當(dāng)線程重新獲取到CPU時(shí)間片后能夠恢復(fù)到正確的執(zhí)行位置。
如果當(dāng)前方法是Java方法,程序計(jì)數(shù)器的值是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址;如果是Native方法,則為空

2.4 虛擬機(jī)棧

是線程私有的,并與線程的生命周期相同。虛擬機(jī)棧中又會(huì)包含多個(gè)棧幀,每運(yùn)行一個(gè)方法就創(chuàng)建一個(gè)棧幀,用于存儲局部變量表、操作棧、方法返回值等。每一個(gè)方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)一個(gè)棧幀在java棧中入棧到出棧的過程。
其中的局部變量表存放了各種基本數(shù)據(jù)類型,對象引用地址和returnAddress。所以局部變量表所需要的內(nèi)存空間在編譯期就可以完成分配。當(dāng)進(jìn)入到一個(gè)方法的時(shí)候,該方法所需要在棧幀中的大小是確定的,并且在運(yùn)行期間不會(huì)改變

2.5 本地方法棧

本地方法棧的作用類似于虛擬機(jī)棧,只不過虛擬機(jī)棧是為執(zhí)行Java方法服務(wù),而本地方法棧則為虛擬機(jī)使用到的native方法服務(wù)

2.6 堆

堆在虛擬機(jī)啟動(dòng)的時(shí)候創(chuàng)建,是被所有線程共享的一塊內(nèi)存區(qū)域。幾乎所有的對象都放在堆上,堆也就成為了垃圾回收的主要區(qū)域。在JDK1.8之前,堆可以分為新生代和老年代,其中新生代又可以細(xì)分為Eden,From和To三塊區(qū)域。

JVM的原理是什么

從JDK1.8開始,永久代從堆內(nèi)存中被轉(zhuǎn)移到本地內(nèi)存中

JVM的原理是什么

2.7 方法區(qū)

各個(gè)線程共享的內(nèi)存區(qū)域,用于存儲已經(jīng)被加載的類信息、常量、靜態(tài)變量、及時(shí)編譯器編譯后的代碼等。在HotSpot虛擬機(jī)上方法區(qū)就對應(yīng)上圖中的永久代。該區(qū)域不需要連續(xù)的內(nèi)存區(qū)域,GC回收的主要目標(biāo)是針對常量池和類型的卸載。

以上是“JVM的原理是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI