溫馨提示×

溫馨提示×

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

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

jvm的內(nèi)存結(jié)構(gòu)主要包含哪幾個部分

發(fā)布時間:2020-06-04 14:24:33 來源:億速云 閱讀:735 作者:Leah 欄目:編程語言

jvm的內(nèi)存結(jié)構(gòu)主要包含哪幾個部分?針對這個問題,今天小編總結(jié)這篇有關(guān)內(nèi)存結(jié)構(gòu)的文章,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。

jvm內(nèi)存分為五大塊:

jvm的內(nèi)存結(jié)構(gòu)主要包含哪幾個部分

標(biāo)灰的是線程公有的內(nèi)存區(qū)域,沒有標(biāo)灰的是線程私有

一:程序計數(shù)器:程序計數(shù)器是用來指示當(dāng)前線程要執(zhí)行哪條指令,并且在執(zhí)行完該條指令后讓程序計數(shù)器指向下一條指令,直到將程序執(zhí)行完畢。指令需要靠cpu來執(zhí)行,在多線程中,多個線程是通過輪流切換分配cpu的時間片而執(zhí)行的,在切換時需要記錄當(dāng)前執(zhí)行到了哪條指令以便將來繼續(xù)執(zhí)行,每一個線程都需要有自己的程序計數(shù)器,所以程序計數(shù)器是線程私有的內(nèi)存。

二:虛擬機(jī)棧:通常我們把jvm的內(nèi)存粗略的分為堆和棧,其中的棧指的就是虛擬機(jī)棧,虛擬機(jī)棧也是線程私有的。

虛擬機(jī)棧對應(yīng)的是方法的內(nèi)存區(qū)域,每個方法執(zhí)行時都會創(chuàng)建一個棧幀,用來存儲該方法的局部變量表,操作數(shù)棧,動態(tài)鏈接,方法返回地址:

jvm的內(nèi)存結(jié)構(gòu)主要包含哪幾個部分

1. 局部變量表局部變量表中存儲的是方法的參數(shù)和方法中定義的局部變量,在編譯期間就為局部變量表分配好了內(nèi)存空間。局部變量表中存儲三種類型的數(shù)據(jù):

(1) 基本數(shù)據(jù)類型

(2) 引用類型:指向一個對象在內(nèi)存中的地址

(3) returnAddress類型:指向指令的地址(已經(jīng)很少見了,指向異常處理的指令,現(xiàn)在已經(jīng)由異常表代替)

2. 操作數(shù)棧:當(dāng)虛擬機(jī)執(zhí)行一些指令的時候會對操作數(shù)棧進(jìn)行入?;虺鰲5牟僮?,比如iadd指令將兩個數(shù)相加,會先將操作數(shù)棧中的兩個數(shù)彈出來(出棧),相加后再壓入棧(入棧)中。

3. 動態(tài)鏈接:在運行時常量池中存儲了諸如類名,方法名,我們要找到目標(biāo)類,執(zhí)行相應(yīng)的方法就需要用到動態(tài)鏈接,棧幀中有一個指向運行時常量池的引用,通過這個引用可以找到相應(yīng)的類名和方法名,但是光知道名稱是沒法執(zhí)行方法的,需要通過名稱找到相應(yīng)的類和方法在內(nèi)存中的地址,這個過程就是動態(tài)鏈接。

4. 方法返回地址:當(dāng)方法執(zhí)行完以后如果有返回值,就會把這個返回值返回給該方法的調(diào)用者,方法的返回就是我們java中用到的return命令。方法返回之后調(diào)用者需要繼續(xù)往下執(zhí)行就需要知道要執(zhí)行的地址,該地址就是方法返回地址,它被記錄在了棧幀中,當(dāng)然在發(fā)生異常的情況下不會有返回值,要繼續(xù)執(zhí)行的地址可以通過異常處理器表來確定。

虛擬機(jī)??赡艹霈F(xiàn)兩種類型的異常:

1. 線程請求的棧深度大于虛擬機(jī)允許的棧深度會拋出StackOverflowError,(虛擬機(jī)??臻g不能動態(tài)擴(kuò)展的情況下)

2. 如果虛擬機(jī)??臻g可以動態(tài)擴(kuò)展(目前多數(shù)的虛擬機(jī)都可以),當(dāng)動態(tài)擴(kuò)展無法申請到足夠的空間時會拋出OutOfMemory異常。

三:本地方法棧:本地方法棧與虛擬機(jī)棧的作用是一樣的,區(qū)別在于虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法服務(wù),而本地方法棧為虛擬機(jī)執(zhí)行native方法服務(wù),native方法為本地方法,不是用java語言寫的有可能是c或者c++寫的,在jdk中就有很多c的代碼,就是提供給本地方法來調(diào)用的。

四:堆:通常我們把jvm的內(nèi)存粗略的分為堆和棧,其中的堆就是指它,它是虛擬機(jī)中占用內(nèi)存最大的一塊,是被所有線程共享的一塊區(qū)域,它是用來存放對象實例的。是垃圾收集器管理的主要區(qū)域。

五:方法區(qū):方法區(qū)也是被所有線程共享的一塊區(qū)域,它存儲的是類信息,常量,靜態(tài)變量,編譯后的字節(jié)碼等信息。方法區(qū)中還有一塊區(qū)域“運行時常量池“:運行時常量池中存儲的是編譯期生成的各種字面量和符號引用。字面量相當(dāng)于Java里常量的概念,比如字符串,聲明為final的常量值等,符號引用包括了:類和接口名,字段名,方法名。

看完上述內(nèi)容,你們對jvm的內(nèi)存結(jié)構(gòu)有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀。

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

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

AI