JVM 年轻代(Eden、From、To)、老年代讲解
生活随笔
收集整理的這篇文章主要介紹了
JVM 年轻代(Eden、From、To)、老年代讲解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述
JVM 的堆空間分成2個區域:年輕代、老年代
年輕代又進一步細分成3個區域:Eden、Survivor From、Survivor To
如下圖所示:
- 默認情況下,年輕代與老年代比例為1:2。可以通過參數-XX:NewRatio修改,NewRatio默認值是2。如果NewRatio修改成3,那么年輕代與老年代比例就是1:3
- 默認情況下Eden、From、To的比例是8:1:1。可以通過參數-XX:SurvivorRatio修改,SurvivorRatio默認值是8,如果SurvivorRatio修改成4,那么其比例就是4:1:1
GC過程
- 所有的年輕代首先會在Eden區進行分配,當Eden區滿了之后會進行第1次Minor GC
- 第1次GC之后仍然存活的對象,會復制到Survivor From區,同時對象年齡+1(此時年齡=1),然后清理其之前占用的內存
- 第2次會對Eden+From同時進行GC,之后仍然存活的對象會復制到Survivor To區,年齡+1,同時清理之前占用的內存(此時From區會變成空)
- 第3次GC之后,From區會存放存活的對象,而To區被清空
- 以此類推…
- 當Survivor區域對象的年齡達到-XX:MaxTenuringThreshold設定的值(默認15),會將此對象移到老年代,同時清空他們在年輕代占用的內存空間
- 當老年代空間不夠用了,會發生Full GC(回收整個堆內存)
- 總結:From和To區總是互相復制,每次GC之后總有其中一個區域會被清空
- 當某些大對象需要分配一塊較大的連續空間時,會直接進入老年代,而不會經過以上步驟
總結
以上是生活随笔為你收集整理的JVM 年轻代(Eden、From、To)、老年代讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM PrintGCDetails打印
- 下一篇: Java使用BTrace动态替换线上cl