Linux雲端計算技術學習:虛擬機器堆記憶體結構

千鋒雲端計算發表於2019-07-04

JVM中堆空間可以分成三個大區,年輕代、老年代、永久代(方法區)。所有新生成的物件首先都是放在年輕代的。年輕代的目標就是儘可能快速的收集掉那些生命週期短的物件。

Linux雲端計算技術學習:虛擬機器堆記憶體結構

年輕代分為三個區域:EDEN、Survivor0(簡稱S0,也通常稱為from區)、Survivor1(簡稱S1,也通常稱為to區)。其中S0與S1的大小是相同等大的,三者所佔年輕代的比例大致為8:1:1,S0與S1就像"孿生兄弟"一樣,我們大家不必去糾結此比例(可以透過修改JVM某些動態引數來調整)的大小.只需謹記三點就好:

1.S0與S1相同大小。

2.EDEN區遠比S(S0+S1)區大,EDEN佔了整個年輕代的大致70%至80%左右。

3.年輕代分為2個區(EDEN區、Survivor區)、3個板塊(EDEN、S0、S1)。

在年輕代中經歷了N次垃圾回收後仍然存活的物件,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命週期較長的物件。那一個物件到底要經過多少次垃圾回收才能從年輕代進入老年代呢?

Linux雲端計算技術學習:虛擬機器堆記憶體結構

我們通常認為在新生代中的物件,每經歷過一次GC,如果它沒有被回收,它的年齡就會被加1, 虛擬機器提供了一個引數來可控制新生代物件的最大年齡:MaxTenuringThreshold。預設情況下,這個引數是15。 也就是說,在新生代的物件最多經歷15次GC,就可以進入老年代。

假如存在一種這樣的情況,一個新生代物件,佔用新生代空間特別大。在GC時若不回收,新生代空間將不足。但是若要回收,程式還沒有使用完。此時就不會依據這個物件的 MaxTenuringThreshold 引數。而是直接晉升到老年代。所以說MaxTenuringThreshold 引數是晉升老年代的充分非必要條件。

Linux雲端計算技術學習:虛擬機器堆記憶體結構

最後永久代也通常被叫做方法區。是一塊所有執行緒共享的記憶體區域。用於儲存系統的類資訊,比如類的欄位、方法、常量池。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69916964/viewspace-2649551/,如需轉載,請註明出處,否則將追究法律責任。

相關文章