這篇文章主要介紹了JVM中內(nèi)存結(jié)構(gòu)是怎么樣的,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
十余年的西疇網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整西疇建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“西疇網(wǎng)站設(shè)計(jì)”,“西疇網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。圖為Java虛擬機(jī)運(yùn)行時(shí)的數(shù)據(jù)區(qū):
也稱(chēng)"永久代” 、“非堆”, 它用于存儲(chǔ)虛擬機(jī)加載的類(lèi)信息、常量、靜態(tài)變量、是各個(gè)線(xiàn)程共享的內(nèi)存區(qū)域。默認(rèn)最小值為16MB,大值為64MB(未驗(yàn)證),可以通過(guò)-XX:PermSize 和 -XX:MaxPermSize 參數(shù)限制方法區(qū)的大小。
運(yùn)行時(shí)常量池:是方法區(qū)的一部分,Class文件中除了有類(lèi)的版本、字段、方法、接口等描述信息外,還有一項(xiàng)信息是常量池,用于存放編譯器生成的各種符號(hào)引用,這部分內(nèi)容將在類(lèi)加載后放到方法區(qū)的運(yùn)行時(shí)常量池中。
描述的是java 方法執(zhí)行的內(nèi)存模型:每個(gè)方法被執(zhí)行的時(shí)候 都會(huì)創(chuàng)建一個(gè)“棧幀”用于存儲(chǔ)局部變量表(包括參數(shù))、操作棧、方法出口等信息。每個(gè)方法被調(diào)用到執(zhí)行完的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中從入棧到出棧的過(guò)程。聲明周期與線(xiàn)程相同,是線(xiàn)程私有的。
局部變量表存放了編譯器可知的各種基本數(shù)據(jù)類(lèi)型(boolean、byte、char、short、int、float、long、 double)、對(duì)象引用(引用指針,并非對(duì)象本身),其中64位長(zhǎng)度的long和double類(lèi)型的數(shù)據(jù)會(huì)占用2個(gè)局部變量的空間,其余數(shù)據(jù)類(lèi)型只占1 個(gè)。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個(gè)方法時(shí),這個(gè)方法需要在棧幀中分配多大的局部變量是完全確定的,在運(yùn)行期間棧幀不會(huì)改變局部 變量表的大小空間。
與虛擬機(jī)?;绢?lèi)似,區(qū)別在于虛擬機(jī)棧為虛擬機(jī)執(zhí)行的java方法服務(wù),而本地方法棧則是為Native方法服務(wù)。
也叫做java 堆、GC堆,是java虛擬機(jī)所管理的內(nèi)存中大的一塊內(nèi)存區(qū)域,也是被各個(gè)線(xiàn)程共享的內(nèi)存區(qū)域,在JVM啟動(dòng)時(shí)創(chuàng)建。該內(nèi)存區(qū)域存放了對(duì)象實(shí)例及數(shù)組(所有new的對(duì)象)。其大小通過(guò)-Xms(最小值)和-Xmx(大值)參數(shù)設(shè)置,-Xms為JVM啟動(dòng)時(shí)申請(qǐng)的最小內(nèi)存,-Xmx為JVM可申請(qǐng)的大內(nèi)存。在JVM啟動(dòng)時(shí),大內(nèi)存會(huì)被保留下來(lái)。為對(duì)象內(nèi)存而保留的地址空間可以被分成年輕代和老年代。
默認(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è)比列,對(duì)于運(yùn)行系統(tǒng),為避免在運(yùn)行時(shí)頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)成一樣。
Parameter | Default Value |
MinHeapFreeRatio | 40 |
MaxHeapFreeRatio | 70 |
-Xms | 3670k |
-Xmx | 64m |
注:如果是64位系統(tǒng),這些值一般需要擴(kuò)張30%,來(lái)容納在64位系統(tǒng)下變大的對(duì)象。
從J2SE 1.2開(kāi)始,JVM使用分代收集算法,在不同年代的區(qū)域里使用不同的算法。堆被劃分為新生代和老年代。新生代主要存儲(chǔ)新創(chuàng)建的對(duì)象和尚未進(jìn)入老年代的對(duì)象。老年代存儲(chǔ)經(jīng)過(guò)多次新生代GC(MinorGC)任然存活的對(duì)象。
注1:圖中的Perm不是堆內(nèi)存,是永久代
注2:圖中的Virtaul則是各區(qū)域還未被分配的內(nèi)存,即大內(nèi)存-當(dāng)前分配的內(nèi)存
新生代包括一塊eden(伊甸園)和2塊survivor(通常又稱(chēng)S0和S1或From和To)。大多數(shù)對(duì)象都是在eden中初始化。而對(duì)于2塊survivor來(lái)說(shuō),總有一塊是空的,它會(huì)在下一個(gè)復(fù)制收集過(guò)程中作為eden中的活躍對(duì)象和另一塊survivor的目的地。在對(duì)象衰老之前(也就是被復(fù)制到tenured之前),它們會(huì)在兩塊survivor區(qū)域之間以這樣的方式復(fù)制。可通過(guò)-Xmn參數(shù)來(lái)指定新生代的大小,也可以通過(guò)-XX:SurvivorRation來(lái)調(diào)整Eden Space及Survivor Space的大小。
用于存放經(jīng)過(guò)多次新生代Minor GC依然存活的對(duì)象,例如緩存對(duì)象,新建的對(duì)象也有可能直接進(jìn)入老年代,主要有兩種情況:①.大對(duì)象,可通過(guò)啟動(dòng)參數(shù)設(shè)置-XX:PretenureSizeThreshold=1024(單位為字節(jié),默認(rèn)為0)來(lái)代表超過(guò)多大時(shí)就不在新生代分配,而是直接在老年代分配。②.大的數(shù)組對(duì)象,即數(shù)組中無(wú)引用外部對(duì)象。
老年代所占的內(nèi)存大小為-Xmx對(duì)應(yīng)的值減去-Xmn對(duì)應(yīng)的值。
是最小的一塊內(nèi)存區(qū)域,它的作用是當(dāng)前線(xiàn)程所執(zhí)行的字節(jié)碼的行號(hào)指示器,在虛擬機(jī)的模型里,字節(jié)碼解釋器工作時(shí)就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、異常處理、線(xiàn)程恢復(fù)等基礎(chǔ)功能都需要依賴(lài)計(jì)數(shù)器完成。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JVM中內(nèi)存結(jié)構(gòu)是怎么樣的”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!