溫馨提示×

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

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

怎樣解析JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理

發(fā)布時(shí)間:2021-10-23 17:19:31 來源:億速云 閱讀:148 作者:柒染 欄目:編程語言

怎樣解析JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

前言

Java虛擬機(jī)定義了若干種程序運(yùn)行期間會(huì)使用的運(yùn)行時(shí)數(shù)據(jù)區(qū)域,其中一些會(huì)隨著虛擬機(jī)啟動(dòng)而創(chuàng)建,隨著虛擬機(jī)的退出而銷毀。另外一些則是和線程一一對(duì)應(yīng),這些與線程對(duì)應(yīng)的數(shù)據(jù)區(qū)域隨著線程開始而創(chuàng)建,線程的結(jié)束而銷毀。

PC寄存器

PC寄存器是一塊較小的內(nèi)存空間,可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,每條線程都要一個(gè)獨(dú)立的PC寄存器,這個(gè)內(nèi)存也是線程私有的內(nèi)存。正在執(zhí)行 java 方法的話,PC寄存器是記錄的是虛擬機(jī)字節(jié)碼指令的地址(當(dāng)前指令的地址)。如果還是 Native 方法,則為undefined。這個(gè)內(nèi)存區(qū)域是唯一一個(gè)在虛擬機(jī)中沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。

虛擬機(jī)棧

虛擬機(jī)棧是描述 java方法執(zhí)行的內(nèi)存模型,每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。每一個(gè)方法從調(diào)用直至執(zhí)行完成的過程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過程。虛擬機(jī)棧的作用與傳統(tǒng)語言的棧類似,用于存儲(chǔ)局部變量和一些尚未計(jì)算的結(jié)果。另外它在方法調(diào)用和返回值中也扮演重要的角色。

虛擬機(jī)棧主要保存的內(nèi)容是棧幀。棧幀是用來存儲(chǔ)數(shù)據(jù)和部分過程結(jié)果的數(shù)據(jù)結(jié)構(gòu),同時(shí)也被用來處理動(dòng)態(tài)鏈接(Dynamic Linking)、 方法返回值和異常分派(Dispatch Exception)。棧幀隨著方法調(diào)用而創(chuàng)建,隨著方法結(jié)束而銷毀——無論方法是正常完成還是異常完成(拋出了在方法內(nèi)未被捕獲的異常)都算作方法結(jié)束。

方法區(qū)

方法區(qū)是一塊所有線程共享的沒存區(qū)域。它用于存儲(chǔ)已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即使編譯器編譯后的代碼等數(shù)據(jù)。方法區(qū)的大小決定了系統(tǒng)可以保存多少個(gè)類。

在JDK1.6、JDK1.7中,方法區(qū)可以理解為永久代(只針對(duì)HotSpot 虛擬機(jī),其他的虛擬機(jī)可能不存在永久代的概念)。永久代可以使用參數(shù)-XX: PermSize和-XX MaxPermSize指定,默認(rèn)情況下-XX MaxPermSize為64M。一個(gè)大的永久代可以保存更多的類信息。如果系統(tǒng)使用一些動(dòng)態(tài)代理,那么有可能會(huì)在運(yùn)行時(shí)生成大量的類,為了保證不會(huì)內(nèi)存溢出,需要設(shè)置一個(gè)合理的永久代大小。HotSpot虛擬機(jī)把GC分代收集擴(kuò)展至方法區(qū), 即使用Java堆的永久代來實(shí)現(xiàn)方法區(qū), 這樣 HotSpot 的垃圾收集器就可以像管理 Java 堆一樣管理這部分內(nèi)存,而不必為方法區(qū)開發(fā)專門的內(nèi)存管理器(永久帶的內(nèi)存回收的主要目標(biāo)是針對(duì)常量池的回收和類型的卸載, 因此收益一般小) 。

在JDK1.8中,永久代已經(jīng)被移除,取而代之的是元空間(MetaSpace),元空間大小可以使用參數(shù)-XX MaxMetaSpaceSize指定。一個(gè)大的元空間可以使系統(tǒng)支持更多的類,只是一塊堆外的直接內(nèi)存。如果不指定大小,默認(rèn)情況下,虛擬機(jī)會(huì)耗盡所有的可用的系統(tǒng)內(nèi)存。類的元數(shù)據(jù)放入直接內(nèi)存, 字符串池和類的靜態(tài)變量放入java堆中,這樣可以加載多少類的元數(shù)據(jù)就不再由MaxPermSize控制,而由系統(tǒng)的實(shí)際可用空間來控制。

元空間與永久代最大的區(qū)別:永久代使用的是JVM的堆內(nèi)存,而元空間使用的是本機(jī)的物理內(nèi)存,所以元空間如果不設(shè)置大小,其大小受本機(jī)物理內(nèi)存的限制。

運(yùn)行時(shí)常量池

運(yùn)行時(shí)常量池(Runtime Constant Pool)是方法區(qū)的一部分。Class 文件中除了有類的版本、字段、方法、接口等描述等信息外,還有一項(xiàng)信息是常量池,用于存放編譯期生成的各種字面量和符號(hào)引用,這部分內(nèi)容將在類加載后存放到方法區(qū)的運(yùn)行時(shí)常量池中。Java 虛擬機(jī)對(duì) Class 文件的每一部分(自然也包括常量池)的格式都有嚴(yán)格的規(guī)定,每一個(gè)字節(jié)用于存儲(chǔ)哪種數(shù)據(jù)都必須符合規(guī)范上的要求,這樣才會(huì)被虛擬機(jī)認(rèn)可、裝載和執(zhí)行。

運(yùn)行時(shí)常量池相較于Class文件的常量池的另一個(gè)特征就是具備動(dòng)態(tài)性。Java語言并不要求常量一定是在編譯期才能產(chǎn)生,也并非Class文件中常量池內(nèi)容才能進(jìn)入運(yùn)行時(shí)常量池,比如String的intern()方法。

本地方法棧

本地方法棧和虛擬機(jī)棧作用類似,區(qū)別是虛擬機(jī)棧為執(zhí)行Java方法服務(wù), 而本地方法棧則為Native方法服務(wù)。虛擬機(jī)規(guī)范中堆本地方法棧使用的語言、使用的方式與數(shù)據(jù)結(jié)構(gòu)并沒有強(qiáng)制規(guī)定,因此虛擬機(jī)可以自由的實(shí)現(xiàn)它。甚至有的虛擬機(jī)(比如HotSpot虛擬機(jī))直接就把本地方法棧和虛擬機(jī)棧合二為一。

Java堆

Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象的實(shí)例,幾乎所有(不是全部都在這里分配)的對(duì)象的實(shí)例都是在這里分配內(nèi)存。由于現(xiàn)代虛擬機(jī)采用分代收集算法, 因此Java堆從GC的角度還可以細(xì)分為: 新生代(Eden區(qū)、From Survivor區(qū)和To Survivor區(qū))和老年代。

新生代是用來存放新生的對(duì)象。一般占據(jù)堆的 1/3空間。由于頻繁創(chuàng)建對(duì)象,所以新生代會(huì)頻繁觸發(fā)MinorGC進(jìn)行垃圾回收。新生代又分為Eden區(qū)、ServivorFrom、ServivorTo 三個(gè)區(qū)。

Eden區(qū)是Java新對(duì)象的出生地(如果新創(chuàng)建的對(duì)象占用內(nèi)存很大,則直接分配到老年代)。當(dāng)Eden區(qū)內(nèi)存不夠的時(shí)候就會(huì)觸MinorGC,對(duì)新生代區(qū)進(jìn)行一次垃圾回收。ServivorFrom上一次 GC 的幸存者,作為這一次 GC 的被掃描者。ServivorTo。保留了一次 MinorGC過程中的幸存者。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

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

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

jvm
AI