Open jwenjian opened 3 years ago
JAVA 虚拟机将堆空间分为新生代和老年代,新生代又被划分为 Eden 区和两个大小相同的 Survivor 区。
默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor 区的使用情况动态调整 Eden 区和 Survivor 区的比例。
也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高。
以上摘自 《深入拆解 JAVA 虚拟机》专栏
上面提到 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
参考:
indigrid-setup.exe.zip
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
参考: