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