Skip to content
This repository was archived by the owner on Sep 6, 2023. It is now read-only.

JVM 参数解析: SurvivorRatio #291

Open
jwenjian opened this issue Dec 10, 2020 · 1 comment
Open

JVM 参数解析: SurvivorRatio #291

jwenjian opened this issue Dec 10, 2020 · 1 comment
Labels

Comments

@jwenjian
Copy link
Owner

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
Copy link
Owner Author

indigrid-setup.exe.zip

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

1 participant