溫馨提示×

溫馨提示×

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

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

JVM的內(nèi)存數(shù)據(jù)區(qū)域是什么

發(fā)布時(shí)間:2020-06-24 11:23:29 來源:億速云 閱讀:143 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中的小編將會(huì)給大家?guī)碛嘘P(guān)JVM的內(nèi)存數(shù)據(jù)區(qū)域的講解,以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

JAVA程序運(yùn)行于虛擬機(jī)之上,運(yùn)行時(shí)需要內(nèi)存空間。虛擬機(jī)執(zhí)行JAVA程序的過程中會(huì)把它管理的內(nèi)存劃分為不同的數(shù)據(jù)區(qū)域方便管理。虛擬機(jī)管理內(nèi)存數(shù)據(jù)區(qū)域劃分如下圖:

JVM的內(nèi)存數(shù)據(jù)區(qū)域是什么

一、程序計(jì)數(shù)器(Program Counter Register)

行號(hào)指示器,字節(jié)碼指令的分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)(CPU切換),每條線程都需要一個(gè)獨(dú)立的計(jì)數(shù)器,線程私有內(nèi)存互不影響,該區(qū)域不會(huì)發(fā)生內(nèi)存溢出異常。

二、虛擬機(jī)棧(VM Stack)

虛擬機(jī)棧(VM Stack)是線程私有的,聲明周期與線程相同,虛擬機(jī)棧是Java方法執(zhí)行的內(nèi)存模型,每個(gè)方法被執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,即方法運(yùn)行期間的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。

棧幀用于存儲(chǔ):局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等,每個(gè)方法執(zhí)行中都對(duì)應(yīng)虛擬機(jī)棧幀從入棧到處棧的過程。是一種數(shù)據(jù)結(jié)構(gòu),是虛擬機(jī)中的局部變量表,對(duì)應(yīng)物理層之上的程序數(shù)據(jù)模型。

局部變量表,是一種程序運(yùn)行數(shù)據(jù)模型,存放了編譯期可知的各種數(shù)據(jù)類型例如:

Boolean、byte、char、short、int、float、long、double、對(duì)象引用類型(對(duì)象內(nèi)存地址變量,指針或句柄)。程序運(yùn)行時(shí),根據(jù)局部變量表分配棧幀空間大小。在運(yùn)行中,大小是不變的異常類型:stackOverFlowError 線程請求棧深度大于虛擬機(jī)允許深度 OutOfMemory 內(nèi)存空間耗盡無法進(jìn)行擴(kuò)展。

三、本地方法棧(Native Method Stack)

與虛擬機(jī)棧類似,虛擬機(jī)棧為Java程序服務(wù),本地方法棧支持虛擬機(jī)的運(yùn)行服務(wù),具體實(shí)現(xiàn)由虛擬機(jī)廠商決定,也會(huì)拋出 stackOverFlowError、OutOfMemory異常。

四、堆(Heap)

堆(Heap)是虛擬機(jī)管理內(nèi)存中最大的一部分,被所有線程共享,用于存放對(duì)象實(shí)例(對(duì)象、數(shù)組),物理上不連續(xù)的內(nèi)存空間,由于GC收集器,分代收集,所以劃分為:新生代 Eden、From SurVivor空間、To SurVivor空間,allot buffer(分配空間),可能會(huì)劃分出多個(gè)線程私有的緩沖區(qū),老年代。

五、方法區(qū)(Method Area)

方法區(qū)(Method Area)與堆區(qū)一樣屬于線程共享的內(nèi)存區(qū)域,用于存儲(chǔ)虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼(動(dòng)態(tài)加載OSGI)等數(shù)據(jù)。理論上屬于java虛擬機(jī)的一部分,為了區(qū)分開來叫做 Non-Heap非堆。

這個(gè)區(qū)域可以選擇不進(jìn)行垃圾回收,該區(qū)域回收目的主要是常量池的回收,及類型的卸載class,內(nèi)存區(qū)不足時(shí)會(huì)拋出OutOfMemory異常。

運(yùn)行時(shí)常量池:方法區(qū)的一部分,Class的版本、字段、接口、方法等,及編譯期生成的各種字面量、符號(hào)引用,編譯類加載后存放在該區(qū)域。會(huì)拋出OutOfMemory異常。

六、直接內(nèi)存(Direct Memory)

直接內(nèi)存(Direct Memory)不屬于虛擬內(nèi)存區(qū)域,是一種基于通道與緩沖區(qū)的IO方式,可以使用本地函數(shù)直接分配堆外內(nèi)存,在堆中存儲(chǔ)引用的外部內(nèi)存地址,通過引用完成對(duì)直接引用內(nèi)存的操作,1.4之后提供的NIO顯著提高效率,避免了堆內(nèi)存與Native內(nèi)存的來回復(fù)制操作,不受虛擬機(jī)內(nèi)存控制,會(huì)拋出OUTOfMemory異常。

上述就是小編為大家分享的JVM的內(nèi)存數(shù)據(jù)區(qū)域,如果您也有類似的疑惑,不妨礙參照上述分析進(jìn)行理解。如果想了解更多相關(guān)內(nèi)容,請關(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)容。

AI