溫馨提示×

溫馨提示×

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

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

java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法

發(fā)布時(shí)間:2020-05-19 15:17:51 來源:億速云 閱讀:251 作者:三月 欄目:編程語言

本文主要給大家簡單講講java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補(bǔ)充一下,這里就不涉獵了,我們就直奔主題吧,希望java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法這篇文章可以給大家?guī)硪恍?shí)際幫助。

什么是JVM?JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。Java虛擬機(jī)包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。

JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。JVM在執(zhí)行字節(jié)碼時(shí),實(shí)際上最終還是把字節(jié)碼解釋成具體平臺上的機(jī)器指令執(zhí)行。

JVM內(nèi)存區(qū)域

JVM在運(yùn)行時(shí)候會將他管理的內(nèi)存劃分為多個區(qū)域,每個區(qū)域都有自己的用途,生命周期。下面我們根據(jù)內(nèi)存分區(qū)圖片逐個擊破:

java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法

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

程序計(jì)數(shù)器所占內(nèi)存小,他的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的指示器,通過改變計(jì)數(shù)器的值來獲取下一條字節(jié)碼指令。

程序計(jì)數(shù)器在執(zhí)行Native方法的時(shí)候,計(jì)數(shù)器的值為空(undefined)。

程序計(jì)數(shù)器是線程私有的,每個線程都會分派一個。

在線視頻教程分享:java學(xué)習(xí)

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

虛擬機(jī)棧為JVM執(zhí)行java方法服務(wù),每個方法被執(zhí)行的時(shí)候都會創(chuàng)建一個棧楨(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法從調(diào)用直至執(zhí)行結(jié)束,就對應(yīng)著一個棧幀從虛擬機(jī)棧中入棧到出棧的過程。

虛擬機(jī)棧的局部變量表內(nèi)存儲了以下數(shù)據(jù):

基本類型數(shù)據(jù)(boolean、byte、char、short、int、float、long、double)

對象引用(reference 類型)

returnAddress 類型(指向了一條字節(jié)碼指令的地址)

需要注意的是局部變量表所需的內(nèi)存空間在編譯期間就已經(jīng)確定了,大小不再變動。

虛擬機(jī)棧也是線程私有的,每個線程都會分派一個。

JVM對虛擬機(jī)棧規(guī)定了兩種異常:

StackOverflowError:線程請求的棧深度大于虛擬機(jī)所允許的深度。

OutOfMemoryError:如果虛擬機(jī)??梢詣討B(tài)擴(kuò)展,而擴(kuò)展時(shí)無法申請到足夠的內(nèi)存。

本地方法棧(Native Method Stack)

本地方法棧與虛擬機(jī)棧類似,主要區(qū)別就在于本地方法棧是專門為Native方法提供服務(wù)。

Native方法:在java中由Native關(guān)鍵字聲明的方法,非java語言實(shí)現(xiàn),是引用本地庫提供的第三方語言方法。

本地方法棧也是線程私有的,每個線程都會分派一個。

堆(Heap)

堆是所有線程共享的內(nèi)存區(qū)域,在JVM啟動時(shí)創(chuàng)建,一般是JVM內(nèi)占用最大的一塊,垃圾收集器(GC)管理的主要區(qū)域。

堆中主要存儲的數(shù)據(jù)為:

對象

數(shù)組

堆可以在物理上不連續(xù),而只要在邏輯上連續(xù)即可,因此是一個可擴(kuò)展的內(nèi)存區(qū)域。

當(dāng)堆內(nèi)存大小不夠創(chuàng)建對象或數(shù)組所占用的內(nèi)存大小,并且不能夠再擴(kuò)展時(shí),會拋出OutOfMemoryError異常。

方法區(qū)(Method Area)

方法區(qū)也是所有線程共享的內(nèi)存區(qū)域。

方法區(qū)主要存儲的數(shù)據(jù)為:

已被JVM加載的類信息

常量(從jdk1.7開始,運(yùn)行時(shí)常量池移動到了堆中)

靜態(tài)變量

即時(shí)編譯器編譯后的代碼等數(shù)據(jù)

垃圾收集器(GC)比較少出現(xiàn)在這個區(qū)域,主要的內(nèi)存回收目標(biāo)是常量池的回收和對類型的卸載。

當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時(shí),會拋出OutOfMemoryError異常。

常量池(Runtime Constant Pool)

常量池屬于方法區(qū)一部分,用于存放編譯期生成的各種字面量和符號引用。編譯期和運(yùn)行期(String 的 intern() )都可以將常量放入池中。內(nèi)存有限,無法申請時(shí)拋出 OutOfMemoryError異常。

從jdk1.7開始,運(yùn)行時(shí)常量池移動到了堆中。

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

直接內(nèi)存并不是JVM運(yùn)行時(shí)內(nèi)存數(shù)據(jù)區(qū)域,也不是JVM規(guī)范中定義的內(nèi)存。

直接內(nèi)存占用物理內(nèi)存大小,需要注意在分配JVM內(nèi)存的時(shí)候要把直接內(nèi)存也計(jì)算在內(nèi),否則在動態(tài)擴(kuò)展內(nèi)存時(shí)可能出現(xiàn)OutOfMemoryError異常。

java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(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