jvm的內(nèi)存結(jié)構(gòu)主要包含哪幾個(gè)部分?針對(duì)這個(gè)問(wèn)題,今天小編總結(jié)這篇有關(guān)內(nèi)存結(jié)構(gòu)的文章,希望能幫助更多想解決這個(gè)問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。
我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、連平ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的連平網(wǎng)站制作公司
jvm內(nèi)存分為五大塊:
標(biāo)灰的是線(xiàn)程公有的內(nèi)存區(qū)域,沒(méi)有標(biāo)灰的是線(xiàn)程私有
一:程序計(jì)數(shù)器:程序計(jì)數(shù)器是用來(lái)指示當(dāng)前線(xiàn)程要執(zhí)行哪條指令,并且在執(zhí)行完該條指令后讓程序計(jì)數(shù)器指向下一條指令,直到將程序執(zhí)行完畢。指令需要靠cpu來(lái)執(zhí)行,在多線(xiàn)程中,多個(gè)線(xiàn)程是通過(guò)輪流切換分配cpu的時(shí)間片而執(zhí)行的,在切換時(shí)需要記錄當(dāng)前執(zhí)行到了哪條指令以便將來(lái)繼續(xù)執(zhí)行,每一個(gè)線(xiàn)程都需要有自己的程序計(jì)數(shù)器,所以程序計(jì)數(shù)器是線(xiàn)程私有的內(nèi)存。
二:虛擬機(jī)棧:通常我們把jvm的內(nèi)存粗略的分為堆和棧,其中的棧指的就是虛擬機(jī)棧,虛擬機(jī)棧也是線(xiàn)程私有的。
虛擬機(jī)棧對(duì)應(yīng)的是方法的內(nèi)存區(qū)域,每個(gè)方法執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,用來(lái)存儲(chǔ)該方法的局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法返回地址:
1.局部變量表:局部變量表中存儲(chǔ)的是方法的參數(shù)和方法中定義的局部變量,在編譯期間就為局部變量表分配好了內(nèi)存空間。局部變量表中存儲(chǔ)三種類(lèi)型的數(shù)據(jù):
(1) 基本數(shù)據(jù)類(lèi)型
(2) 引用類(lèi)型:指向一個(gè)對(duì)象在內(nèi)存中的地址
(3) returnAddress類(lèi)型:指向指令的地址(已經(jīng)很少見(jiàn)了,指向異常處理的指令,現(xiàn)在已經(jīng)由異常表代替)
2.操作數(shù)棧:當(dāng)虛擬機(jī)執(zhí)行一些指令的時(shí)候會(huì)對(duì)操作數(shù)棧進(jìn)行入?;虺鰲5牟僮?,比如iadd指令將兩個(gè)數(shù)相加,會(huì)先將操作數(shù)棧中的兩個(gè)數(shù)彈出來(lái)(出棧),相加后再壓入棧(入棧)中。
3.動(dòng)態(tài)鏈接:在運(yùn)行時(shí)常量池中存儲(chǔ)了諸如類(lèi)名,方法名,我們要找到目標(biāo)類(lèi),執(zhí)行相應(yīng)的方法就需要用到動(dòng)態(tài)鏈接,棧幀中有一個(gè)指向運(yùn)行時(shí)常量池的引用,通過(guò)這個(gè)引用可以找到相應(yīng)的類(lèi)名和方法名,但是光知道名稱(chēng)是沒(méi)法執(zhí)行方法的,需要通過(guò)名稱(chēng)找到相應(yīng)的類(lèi)和方法在內(nèi)存中的地址,這個(gè)過(guò)程就是動(dòng)態(tài)鏈接。
4.方法返回地址:當(dāng)方法執(zhí)行完以后如果有返回值,就會(huì)把這個(gè)返回值返回給該方法的調(diào)用者,方法的返回就是我們java中用到的return命令。方法返回之后調(diào)用者需要繼續(xù)往下執(zhí)行就需要知道要執(zhí)行的地址,該地址就是方法返回地址,它被記錄在了棧幀中,當(dāng)然在發(fā)生異常的情況下不會(huì)有返回值,要繼續(xù)執(zhí)行的地址可以通過(guò)異常處理器表來(lái)確定。
虛擬機(jī)??赡艹霈F(xiàn)兩種類(lèi)型的異常:
1.線(xiàn)程請(qǐng)求的棧深度大于虛擬機(jī)允許的棧深度會(huì)拋出StackOverflowError,(虛擬機(jī)棧空間不能動(dòng)態(tài)擴(kuò)展的情況下)
2.如果虛擬機(jī)??臻g可以動(dòng)態(tài)擴(kuò)展(目前多數(shù)的虛擬機(jī)都可以),當(dāng)動(dòng)態(tài)擴(kuò)展無(wú)法申請(qǐng)到足夠的空間時(shí)會(huì)拋出OutOfMemory異常。
三:本地方法棧:本地方法棧與虛擬機(jī)棧的作用是一樣的,區(qū)別在于虛擬機(jī)棧為虛擬機(jī)執(zhí)行java方法服務(wù),而本地方法棧為虛擬機(jī)執(zhí)行native方法服務(wù),native方法為本地方法,不是用java語(yǔ)言寫(xiě)的有可能是c或者c++寫(xiě)的,在jdk中就有很多c的代碼,就是提供給本地方法來(lái)調(diào)用的。
四:堆:通常我們把jvm的內(nèi)存粗略的分為堆和棧,其中的堆就是指它,它是虛擬機(jī)中占用內(nèi)存最大的一塊,是被所有線(xiàn)程共享的一塊區(qū)域,它是用來(lái)存放對(duì)象實(shí)例的。是垃圾收集器管理的主要區(qū)域。
五:方法區(qū):方法區(qū)也是被所有線(xiàn)程共享的一塊區(qū)域,它存儲(chǔ)的是類(lèi)信息,常量,靜態(tài)變量,編譯后的字節(jié)碼等信息。方法區(qū)中還有一塊區(qū)域“運(yùn)行時(shí)常量池“:運(yùn)行時(shí)常量池中存儲(chǔ)的是編譯期生成的各種字面量和符號(hào)引用。字面量相當(dāng)于Java里常量的概念,比如字符串,聲明為final的常量值等,符號(hào)引用包括了:類(lèi)和接口名,字段名,方法名。
看完上述內(nèi)容,你們對(duì)jvm的內(nèi)存結(jié)構(gòu)有進(jìn)一步的了解嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。