JVM中內(nèi)存結(jié)構(gòu)是怎么樣的-創(chuàng)新互聯(lián)

這篇文章主要介紹了JVM中內(nèi)存結(jié)構(gòu)是怎么樣的,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

十余年的西疇網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。網(wǎng)絡(luò)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整西疇建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“西疇網(wǎng)站設(shè)計”,“西疇網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

圖為Java虛擬機(jī)運行時的數(shù)據(jù)區(qū):

JVM中內(nèi)存結(jié)構(gòu)是怎么樣的

1.方法區(qū)

也稱"永久代” 、“非堆”,  它用于存儲虛擬機(jī)加載的類信息、常量、靜態(tài)變量、是各個線程共享的內(nèi)存區(qū)域。默認(rèn)最小值為16MB,大值為64MB(未驗證),可以通過-XX:PermSize 和 -XX:MaxPermSize 參數(shù)限制方法區(qū)的大小。

運行時常量池:是方法區(qū)的一部分,Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯器生成的各種符號引用,這部分內(nèi)容將在類加載后放到方法區(qū)的運行時常量池中。

2.虛擬機(jī)棧

描述的是java 方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候 都會創(chuàng)建一個“棧幀”用于存儲局部變量表(包括參數(shù))、操作棧、方法出口等信息。每個方法被調(diào)用到執(zhí)行完的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中從入棧到出棧的過程。聲明周期與線程相同,是線程私有的。

 局部變量表存放了編譯器可知的各種基本數(shù)據(jù)類型(boolean、byte、char、short、int、float、long、 double)、對象引用(引用指針,并非對象本身),其中64位長度的long和double類型的數(shù)據(jù)會占用2個局部變量的空間,其余數(shù)據(jù)類型只占1 個。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個方法時,這個方法需要在棧幀中分配多大的局部變量是完全確定的,在運行期間棧幀不會改變局部 變量表的大小空間。

3.本地方法棧

 與虛擬機(jī)?;绢愃疲瑓^(qū)別在于虛擬機(jī)棧為虛擬機(jī)執(zhí)行的java方法服務(wù),而本地方法棧則是為Native方法服務(wù)。

4.堆 

也叫做java 堆、GC堆,是java虛擬機(jī)所管理的內(nèi)存中大的一塊內(nèi)存區(qū)域,也是被各個線程共享的內(nèi)存區(qū)域,在JVM啟動時創(chuàng)建。該內(nèi)存區(qū)域存放了對象實例及數(shù)組(所有new的對象)。其大小通過-Xms(最小值)和-Xmx(大值)參數(shù)設(shè)置,-Xms為JVM啟動時申請的最小內(nèi)存,-Xmx為JVM可申請的大內(nèi)存。在JVM啟動時,大內(nèi)存會被保留下來。為對象內(nèi)存而保留的地址空間可以被分成年輕代和老年代。

默認(rèn)當(dāng)空余堆內(nèi)存小于40%時,JVM會增大Heap到-Xmx指定的大小,可通過-XX:MinHeapFreeRation=來指定這個比列;當(dāng)空余堆內(nèi)存大于70%時,JVM會減小heap的大小到-Xms指定的大小,可通過XX:MaxHeapFreeRation=來指定這個比列,對于運行系統(tǒng),為避免在運行時頻繁調(diào)整Heap的大小,通常-Xms與-Xmx的值設(shè)成一樣。

Parameter

Default Value

MinHeapFreeRatio

40

MaxHeapFreeRatio

70

-Xms

3670k

-Xmx

64m

注:如果是64位系統(tǒng),這些值一般需要擴(kuò)張30%,來容納在64位系統(tǒng)下變大的對象。

從J2SE 1.2開始,JVM使用分代收集算法,在不同年代的區(qū)域里使用不同的算法。堆被劃分為新生代和老年代。新生代主要存儲新創(chuàng)建的對象和尚未進(jìn)入老年代的對象。老年代存儲經(jīng)過多次新生代GC(MinorGC)任然存活的對象。

JVM中內(nèi)存結(jié)構(gòu)是怎么樣的

注1:圖中的Perm不是堆內(nèi)存,是永久代

注2:圖中的Virtaul則是各區(qū)域還未被分配的內(nèi)存,即大內(nèi)存-當(dāng)前分配的內(nèi)存

新生代:

新生代包括一塊eden(伊甸園)和2塊survivor(通常又稱S0和S1或From和To)。大多數(shù)對象都是在eden中初始化。而對于2塊survivor來說,總有一塊是空的,它會在下一個復(fù)制收集過程中作為eden中的活躍對象和另一塊survivor的目的地。在對象衰老之前(也就是被復(fù)制到tenured之前),它們會在兩塊survivor區(qū)域之間以這樣的方式復(fù)制??赏ㄟ^-Xmn參數(shù)來指定新生代的大小,也可以通過-XX:SurvivorRation來調(diào)整Eden Space及Survivor Space的大小。

老年代:

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

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

5.程序計數(shù)器 

是最小的一塊內(nèi)存區(qū)域,它的作用是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器,在虛擬機(jī)的模型里,字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴計數(shù)器完成。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“JVM中內(nèi)存結(jié)構(gòu)是怎么樣的”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

網(wǎng)頁名稱:JVM中內(nèi)存結(jié)構(gòu)是怎么樣的-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://muchs.cn/article44/dsgohe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、外貿(mào)建站、品牌網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計、電子商務(wù)企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化