JVM 內(nèi)存結(jié)構(gòu)

描述

? ? ? ? JVM定義了若干個(gè)程序執(zhí)行期間使用的數(shù)據(jù)區(qū)域。這個(gè)區(qū)域里的一些數(shù)據(jù)在JVM啟動(dòng)的時(shí)候創(chuàng)建,在JVM退出的時(shí)候銷毀。而其他的數(shù)據(jù)依賴于每一個(gè)線程,在線程創(chuàng)建時(shí)創(chuàng)建,在線程退出時(shí)銷毀

Java中的內(nèi)存分配:

? ? ? ? Java程序在運(yùn)行時(shí),需要在內(nèi)存中的分配空間。為了提高運(yùn)算效率,就對(duì)數(shù)據(jù)進(jìn)行了不同空間的劃分,因?yàn)槊恳黄瑓^(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式。

一. 程序計(jì)數(shù)器

?描述:程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器。分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個(gè)計(jì)數(shù)器來(lái)完成。

1)在線程創(chuàng)建時(shí)創(chuàng)建

2)當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器

3)執(zhí)行本地方法時(shí),PC的值為undefined

4)每條線程都需要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,各條線程之間的計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ),我們稱這類內(nèi)存區(qū)域?yàn)椤?b>線程私有”的內(nèi)存

5)此內(nèi)存區(qū)域是唯一一個(gè)在Java 虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域

二. 虛擬機(jī)棧

描述:線程私有,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java 方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀(Stack Frame)用于存儲(chǔ)局部變量表、操作棧、動(dòng)態(tài)鏈接、方法出口等信息。

設(shè)置大?。?Xss2M

1)線程私有,生命周期和線程相同

2)棧由一系列幀組成(因此Java棧也叫做幀棧)

3)幀保存方法參數(shù),方法的局部變量、操作數(shù)棧、常量池,指針

4)每一次方法調(diào)用創(chuàng)建一個(gè)幀,并壓棧

三. 方法區(qū)

描述:方法區(qū)在一個(gè)jvm實(shí)例的內(nèi)部,類型信息被存儲(chǔ)在一個(gè)稱為方法區(qū)的內(nèi)存邏輯區(qū)中。類型信息是由類加載器在類加載時(shí)從類文件中提取出來(lái)的。類(靜態(tài))變量也存儲(chǔ)在方法區(qū)中。

簡(jiǎn)單說(shuō)方法區(qū)用來(lái)存儲(chǔ)類型的元數(shù)據(jù)信息

設(shè)置大?。?XX:PermSize=10M -XX:MaxPermSize=10M

1)保存裝載的類信息

2) 存儲(chǔ)常量池

3) 存儲(chǔ)static變量,方法信息(方法名,返回類型,參數(shù)列表,方法的修飾符)

4)?通常和永久區(qū)(Perm)關(guān)聯(lián)在一起可以通過(guò)-XX:PermSize-XX:MaxPermSize參數(shù)限制方法區(qū)的大小

5)方法區(qū)是線程安全的。由于所有的線程都共享方法區(qū),所以,方法區(qū)里的數(shù)據(jù)訪問(wèn)必須被設(shè)計(jì)成線程安全的

6) ?方法區(qū)也可被垃圾收集,當(dāng)某個(gè)類不在被使用(不可觸及)時(shí),JVM將卸載這個(gè)類,進(jìn)行垃圾收集

四.常量池

描述:運(yùn)行時(shí)常量池是方法區(qū)的一部分.Class文件中除了有類的版本,字段,方法,接口等描述信息外還有一項(xiàng)信息是常量池,用于存放編譯期生成的各種字面量和符號(hào)引用,這部分內(nèi)容將在類加載后進(jìn)入方法區(qū)運(yùn)行時(shí)常量池中存放

五.堆(heap)內(nèi)存

描述:堆是Java 虛擬機(jī)所管理的內(nèi)存中最大的一塊。Java 堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存

設(shè)置大小:-Xms2g -Xmx2g -Xmn1g-Xss128k

-Xms2G 虛擬機(jī)內(nèi)存最小2G

-Xms2G 虛擬機(jī)內(nèi)存最大2G

-Xmn1G 年輕代內(nèi)存1G

-Xss128 每個(gè)線程堆棧大小

1) ?Java 堆是被所有線程共享的

2) ?存放對(duì)象實(shí)例,幾乎所有對(duì)象的實(shí)例都在這里分配內(nèi)存

3)堆是垃圾收集器管理的主要區(qū)域,因此很多時(shí)候也被稱做“GC 堆”。

4)堆的大小可以通過(guò)-Xms(最小值)和-Xmx(最大值)參數(shù)設(shè)置,-Xms為JVM啟動(dòng)時(shí)申請(qǐng)的最小內(nèi)存,默認(rèn)為操作系統(tǒng)物理內(nèi)存的1/64但小于1G,-Xmx為JVM可申請(qǐng)的最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4但小于1G

5) ?默認(rèn)當(dāng)空余堆內(nèi)存小于40%時(shí),JVM會(huì)增大Heap到-Xmx指定的大小,可通過(guò)-XX:MinHeapFreeRation=來(lái)指定這個(gè)比列;當(dāng)空余堆內(nèi)存大于70%時(shí),JVM會(huì)減小heap的大小到-Xms指定的大小,可通過(guò)XX:MaxHeapFreeRation=來(lái)指定這個(gè)比列

6) ?從內(nèi)存回收的角度看,由于現(xiàn)在收集器基本都是采用的分代收集算法,所以Java 堆中還可以細(xì)分為:新生代和老年代

新生代:程序新創(chuàng)建的對(duì)象都是從新生代分配內(nèi)存,新生代由Eden Space和兩塊相同大小的Survivor Space(通常又稱S0和S1或From和To)構(gòu)成,可通過(guò)-Xmn參數(shù)來(lái)指定新生代的大小,也可以通過(guò)-XX:SurvivorRation來(lái)調(diào)整Eden Space及SurvivorSpace的大小

老年代:用于存放經(jīng)過(guò)多次新生代GC仍然存活的對(duì)象,例如緩存對(duì)象,新建的對(duì)象也有可能直接進(jìn)入老年代,主要有兩種情況:1、大對(duì)象,可通過(guò)啟動(dòng)參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)為0)來(lái)代表超過(guò)多大時(shí)就不在新生代分配,而是直接在老年代分配。2、大的數(shù)組對(duì)象,且數(shù)組中無(wú)引用外部對(duì)象。

老年代所占的內(nèi)存大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值。

六.?本地方法棧

描述本地方法棧(Native MethodStacks)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java 方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的Native 方法服務(wù)。虛擬機(jī)規(guī)范中對(duì)本地方法棧中的方法使用的語(yǔ)言、使用方式與數(shù)據(jù)結(jié)構(gòu)并沒(méi)有強(qiáng)制規(guī)定,因此具體的虛擬機(jī)可以自由實(shí)現(xiàn)本地方法棧。

七. 直接內(nèi)存

描述:直接內(nèi)存并不是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分,也不是java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域。但是這部分內(nèi)存也被頻繁使用,而且也有可能導(dǎo)致OutOfMemoryError一場(chǎng)的出現(xiàn)

NIO(New Input/Output)類引入一種基于通道(Channel)與緩沖區(qū)(Buffer)的I/O 方式,它可以使用Native函數(shù)庫(kù)直接分貝堆外內(nèi)存,然后通過(guò)一個(gè)存儲(chǔ)在java堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容