jwenjian / ghiblog

GitHub Issues Blog, powered by GitHub Issues and GitHub Actions
https://1link.fun
352 stars 45 forks source link

JVM 参数解析: SurvivorRatio #291

Open jwenjian opened 3 years ago

jwenjian commented 3 years ago

JAVA 虚拟机将堆空间分为新生代和老年代,新生代又被划分为 Eden 区和两个大小相同的 Survivor 区。

image

默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor 区的使用情况动态调整 Eden 区和 Survivor 区的比例。

也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高

以上摘自 《深入拆解 JAVA 虚拟机》专栏

上面提到 SurvivorRatio 这个 JVM 参数,这个比例越低,浪费的堆空间越高,分析如下:

  1. SurvivorRatio 代表的是每个 survivor 区域和 eden 区域的内存占比,比如 -XX:SurvivorRatio=6,那么说明每个 survivor 区域和 eden 区域的内存比例为 1:6,也就是说每个 survivor 区域占用的内存是新生代内存大小的 1/8(因为新生代中有两个survivor区域,8 = 1(survivor) + 1(survivor) + 6(eden))。

  2. 这个值越小,比如是2,那么说明每个survivor区域就会占用到新生代内存大小的 1/4(1+1+2),而又因为其中一个survivor一定是空的(复制回收算法),所以浪费的空间就会加大。

比如新生代大小为8G,当 survivorRatio = 6 时,浪费的空间为 1G,当 survivorRatio = 2 时,浪费的空间为 2G

参考:

jwenjian commented 3 years ago

indigrid-setup.exe.zip