堆空间结构图

java 默认jvm大小 jvm默认比例_java 默认jvm大小

本文需要读者对JVM内存结构和GC具有一定的理解
本文主要说明-XX:SurvivorRatio的默认值8,即新生代的伊甸园去和幸存者区的默认比例:8:1:1 说法的不准确性

堆空间大小设置

-Xms100M -Xmx300M 等价于-XX:InitialHeapSize=100M -XX:MaxHeapSize=300M
堆空间初始化大小100M、最大可扩展到300M
如果空间足够的情况下建议堆空间初始值和最大值设置成一样从而避免内存空间收缩。

年轻代和老年代空间比例

JVM堆空间分为年轻代和老年代(备注:关于常量池转义等不在此处讨论),可以通过JVM参数-XX:NewRatio设置,默认值为2。此参数代表老年代的占比值。举例:

-Xms300M -Xmx300M -XX:NewRatio=2
堆空间整个大小为300M,年轻代和老年代比例:1:2,年轻代空间为100M,老年代空间为200M

-Xms400M -Xmx400M -XX:NewRatio=3
堆空间整个大小为400M,年轻代和老年代比例:1:3,年轻代空间为100M,老年代空间为300M

年轻代伊甸园区和幸存者区的空间比例

年轻代可以划分为伊甸园区、幸存者0区和幸存者1区(from区和to区),可以通过JVM参数-XX:SurvivorRatio设置,默认值为8。此参数代表伊甸园去的占比值。举例:

-Xms300M -Xmx300M -XX:SurvivorRatio=8
堆空间整个大小为300M,-XX:NewRatio默认值为2,则年轻代和老年代比例:1:2,年轻代空间为100M,老年代空间为200M。-XX:SurvivorRatio=8,伊甸园区、幸存者0区和幸存者1区比例为: 8:1:1,即伊甸园区80M,幸存者0区和幸存者1区都是10M。

-XX:SurvivorRatio默认值8不起作用(本文重点)

  • 上文提到-XX:SurvivorRatio默认值为8,只是针对Serial GC和CMS GC有效,即通过工具查看可以发现8:1:1
  • 在JDK7/8默认都是Parallel GC,如果查看比例会发现实际配置是6:1:1,这个是因为Parallel GC会根据自己情况自动调整,JDK工具文档提到是禁用自动适配大小策略参数(-XX:-UseAdaptiveSizePolicy),但是实际上没有任何效果,除非显式声明-XX:SurvivorRatio=8。
  • 此外JDK8及以上版本中的G1 GC对于这个参数就完全不感冒了,不管是默认值还是显式声明。这个涉及G1 GC的内存分配策略,此处不再讨论。