You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Sep 6, 2023. It is now read-only.
JAVA 虚拟机将堆空间分为新生代和老年代,新生代又被划分为 Eden 区和两个大小相同的 Survivor 区。
默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor 区的使用情况动态调整 Eden 区和 Survivor 区的比例。
也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高。
上面提到 SurvivorRatio 这个 JVM 参数,这个比例越低,浪费的堆空间越高,分析如下:
SurvivorRatio 代表的是每个 survivor 区域和 eden 区域的内存占比,比如 -XX:SurvivorRatio=6,那么说明每个 survivor 区域和 eden 区域的内存比例为 1:6,也就是说每个 survivor 区域占用的内存是新生代内存大小的 1/8(因为新生代中有两个survivor区域,8 = 1(survivor) + 1(survivor) + 6(eden))。
这个值越小,比如是2,那么说明每个survivor区域就会占用到新生代内存大小的 1/4(1+1+2),而又因为其中一个survivor一定是空的(复制回收算法),所以浪费的空间就会加大。
比如新生代大小为8G,当 survivorRatio = 6 时,浪费的空间为 1G,当 survivorRatio = 2 时,浪费的空间为 2G
参考:
The text was updated successfully, but these errors were encountered: