Java JVM堆空间分配令人困惑

Java JVM堆空间分配令人困惑,java,jvm,Java,Jvm,我有一个java应用程序,最大堆大小为8gb 在32 GB内存上,旧gen的片容量为7.4 GB(约)。在128GB内存中,同一个应用程序可以获得一个6.2GB(约)的旧版本片 我想知道JVM在内部是如何做到这一点的?是否有一个数学,它使用。实际上,我正处于GC调优阶段,如果我知道默认情况下这个数字是如何到达的,那将非常有帮助。我使用JDK1.7。它与系统中的总RAM无关。GC比率影响不同区域中可以存在的内存量 -XX:NewRatio=n旧/新一代尺寸的比率。默认值为2 -XX:Survivo

我有一个
java
应用程序,最大堆大小为8gb

在32 GB内存上,旧gen的片容量为7.4 GB(约)。在128GB内存中,同一个应用程序可以获得一个6.2GB(约)的旧版本片


我想知道
JVM
在内部是如何做到这一点的?是否有一个数学,它使用。实际上,我正处于
GC
调优阶段,如果我知道默认情况下这个数字是如何到达的,那将非常有帮助。我使用JDK1.7。

它与系统中的总RAM无关。GC比率影响不同区域中可以存在的内存量

-XX:NewRatio=n旧/新一代尺寸的比率。默认值为2

-XX:SurvivorRatio=n伊甸园/幸存者空间大小的比率。默认值为8

-XX:MaxHeapFreeRatio=70 GC后堆空闲的最大百分比,以避免收缩

使用前2个比率在VM本身内部调整堆的比率。使用空闲堆比率调整堆可以增长/收缩的内存量


推荐阅读-Oracle提供。

但事实上,我没有设置任何JVM tunning指标。我的问题是,默认情况下,内存正在被分配。对于具有相同最大堆设置的同一应用程序,两台不同的计算机有何不同?很可能不同的负载会导致两台计算机的内存配置文件不同。除非您得到一个负载测试,以便在具有相同JVM和调优参数的两台机器之间提供一致的负载,否则您的比较不会成立。谢谢Bala。我在找那个。负载实际上为零,因为两者都是专用机器。因此,内存配置文件确实决定了JVM堆的各个部分。我可以这样做吗?如果负载为零,为什么幸存者空间会有很多物体?调整比率/获得一致执行的负载测试/根据测试比较各个区域中使用的内存。这就是解决问题的方法。是的,这些比率决定了堆的哪些部分占用更多内存。我发布的结果都是预先分配的数字。我提到的数字是从8GB堆中分配的旧Gen空间量。猜猜,你把它误认为是空间使用了