堆分代(年輕代,老年代)


新生代內存分區

1,為什么需要把堆分代?

分代的唯一理由就是優化GC性能

  • 如果沒有分代,所有的對象都在一塊,GC的時要找到哪些對象是沒用的,這樣就會對堆的所有區域進行掃描。而我們的很多對象都是朝生夕死的。
  • 如果分代的話,把新創建的對象放到某一地方,當GC的時先把這塊存“朝生夕死”對象的區域進行回收,這樣就會騰出很大的空間出來。

2,Minor GC、Major GC和Full GC之間的區別

  • 從年輕代空間(包括 Eden 和 Survivor 區域)回收內存被稱為 Minor GC
  • Major GC 是清理老年代。
  • Full GC 是清理整個堆空間—包括年輕代和老年代。

3,年輕代中的GC

3,1,HotSpot JVM把年輕代分為了三部分:

1個Eden區和2個Survivor區(分別叫from和to)。默認比例為8:1

3,2,年輕和老年代的關系

 

一般情況下,新創建的對象都會被分配到Eden區(一些大對象特殊處理),這些對象經過第一次Minor GC后,
如果仍然存活,將會被移到Survivor區。對象在Survivor區中每熬過一次Minor GC,年齡就會增加1歲,
當它的年齡增加到一定程度時,就會被移動到年老代中。

3,3,年輕代采用復制算法回收對象

因為年輕代中的對象基本都是朝生夕死的(80%以上),所以在年輕代的垃圾回收算法使用的是復制算法,

將內存分為兩塊,每次只用其中一塊,當這一塊內存用完,就將還活着的對象復制到另外一塊上面。
復制算法不會產生內存碎片。

3,4,年輕代回收的步驟:

1,在GC開始的時候,對象只會存在於Eden區和名為“From”的Survivor區,Survivor區“To”是空的。
2,緊接着進行GC,Eden區中所有存活的對象都會被復制到“To”,
3,而在“From”區中,仍存活的對象會根據他們的年齡值來決定去向。
   年齡達到一定值(年齡閾值,可以通過-XX:MaxTenuringThreshold來設置)的對象會被移動到年老代中,沒有達到閾值的對象會被復制到“To”區域。
4,經過這次GC后,Eden區和From區已經被清空。
   這個時候,“From”和“To”會交換他們的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。
   不管怎樣,都會保證名為To的Survivor區域是空的。
5,Minor GC會一直重復這樣的過程,直到“To”區被填滿,“To”區被填滿之后,會將所有對象移動到年老代中。

4.有關年輕代的JVM參數

1)-XX:NewSize和-XX:MaxNewSize

用於設置年輕代的大小,建議設為整個堆大小的1/3或者1/4,兩個值設為一樣大。

2)-XX:SurvivorRatio

用於設置Eden和其中一個Survivor的比值,這個值也比較重要。

3)-XX:+PrintTenuringDistribution

這個參數用於顯示每次Minor GC時Survivor區中各個年齡段的對象的大小。

4).-XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold

用於設置晉升到老年代的對象年齡的最小值和最大值,每個對象在堅持過一次Minor GC之后,年齡就加1。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM