Java Memory Eden Survivor

作用范围

  Eden 和 Survivor 两部分代表整个年轻代。Eden 存放新创建的对象,Survivor 存放 YGC 后依然存活的对象。

相关参数

  Eden Survivor 主要参数有 3 个,分别介绍一下:

  • -XX:SurvivorRatio

    Eden/Survivor 空间比例

  • -XX:MinSurvivorRatio

    新生代 /Survivor 最小比例

  • -XX:InitialSurvivorRatio

    新生代 / Survivor 初始比例

使用案例

  • -XX:SurvivorRatio=8 代表 Eden 与 Survivor 比例为 8:2。

  • -XX:MinSurvivorRatio=3 代表最小的年轻代与 Survivor 比例为 3。

  • -XX:InitialSurvivorRatio=8 代表初始化的年轻代与 Survivor 比例为 8。

参数默认值

   以下为默认值均为 Linux 平台下的默认值。

参数 默认值 JDK 版本
-XX:SurvivorRatio 8 jdk1.8
-XX:MinSurvivorRatio 3 jdk1.8
-XX:InitialSurvivorRatio 8 jdk1.8

注意事项

  • SurvivorRatio 默认值 8 最小值 1。

  • InitialSurvivorRatio 和 MinSurvivorRatio 只在 PS GC 算法下生效。

  • 当 MinHeapRatio 不为 0 或 MaxHeapRatio 不为 100 时,在 GC 之后就会重新计算 Survivor 的值。

  • InitialSurvivorRatio 默认值 8,表示新生代初始可用内存 /Survivor 的比值。默认情况表示 From 和 To 各占整个新生代 1/8,而 Eden 占(1 - 2*1/8 = 3/4),并且只在启动时有效。

  • MinSurvivorRatio 表示在 GC 之后,如果需要重新计算 Survivor 的值,Survivor 的值不能低于根据 MinSurvivorRatio 算出来的值。开启 UseAdaptiveSizePolicy 参数时才会计算值。

  • CMS GC 下如果 MaxTenuringThreshold 设置为 0 的话,相当于每次 GC 后都直接晋升到老年代,此时如果 SurvivorRatio 没有设置的话,会将 SurvivorRatio 默认设置为 1024(这是 CMS GC 的一个优化)。

实践问题

  • SurvivorRatio 若为 0 会怎样?

    程序报错,无法启动 JVM。

    $ java -XX:SurvivorRatio=0 Test
    Error occurred during initialization of VM
    Invalid young gen ratio specified
  • InitialSurvivorRatio 小于 3 会怎样?

    会重置 InitialSurvivorRatio 值为 3。

    $ java -XX:InitialSurvivorRatio=2 Test
    
    $ jps
    86821 Test
    
    $ jinfo -flag InitialSurvivorRatio 86821
    -XX:InitialSurvivorRatio=3
  • MinSurvivorRatio 小于 3 会怎样?

    会重置 MinSurvivorRatio 值为 3。

    $ java -XX:MinSurvivorRatio=2 Test
    
    $ jps
    $ 87207 Test
    
    $ jinfo -flag MinSurvivorRatio 87207
    -XX:MinSurvivorRatio=3
  • 设置 SurvivorRatio 不设置 InitialSurvivorRatio 会怎样?

    InitialSurvivorRatio 等于 SurvivorRatio + 2。

    $ java -XX:SurvivorRatio=4 Test
    
    $ jps
    87710 Test
    
    $ jinfo -flag InitialSurvivorRatio 87710
    -XX:InitialSurvivorRatio=6
    $ java -XX:SurvivorRatio=6 Test
    
    $ jps
    87710 Test
    
    $ jinfo -flag InitialSurvivorRatio 87710
    -XX:InitialSurvivorRatio=8
  • 设置 SurvivorRatio 不设置 MinSurvivorRatio 会怎样?

    $ java -XX:SurvivorRatio=4 Test
    
    $ jps
    88546 Test
    
    $ jinfo -flag MinSurvivorRatio 88546
    -XX:MinSurvivorRatio=6
    $ java -XX:SurvivorRatio=6 Test
    
    $ jps
    88546 Test
    
    $ jinfo -flag MinSurvivorRatio 88546
    -XX:MinSurvivorRatio=8


Java     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!