我有一个进程,在旧代空间中消耗了很少的内存。由于这个原因,大量的内存被浪费了。我尝试使用 NewRatio 参数调整旧代空间,但无法将其降低到 1 以下。即使将其设置为 1 后,旧代区域中仍有大量空间根本没有被使用。
是否有任何方法/配置可以在不减少年轻一代大小的情况下减少老一代空间的大小?
谢谢, 尼廷·戈斯瓦米
最佳答案
您可以使用以下 JVM 参数控制堆大小:
-Xms值
-Xmx值
-XX:MinHeapFreeRatio=最小值
-XX:MaxHeapFreeRatio=最大值
-XX:NewRatio=比率
-XX:NewSize=大小
-XX:MaxNewSize=大小
-XX:+AggressiveHeap
-Xms 和 -Xmx 参数分别定义最小和最大堆大小。由于 GC 在各代填满时发生,因此吞吐量与可用内存量成反比。默认情况下,JVM 在每次 GC 时都会增大或缩小堆,以尽量将每次收集时的可用空间与存活对象的比例保持在特定范围内。该范围由参数 -XX:MinHeapFreeRatio=minimum 和 -XX:MaxHeapFreeRatio=maximum 设置为百分比;以及由 -Xms 和 -Xmx 限制的总大小。
对于固定堆大小,将 -Xms 和 -Xmx 的值设置为彼此相等。当堆增长或收缩时,JVM 必须重新计算旧代和新生代大小以维持预定义的 NewRatio。
NewSize 和 MaxNewSize 参数控制新生代的最小和最大大小。通过将这些参数设置为相等来调节新生代的大小。年轻一代规模越大,小型收集发生的频率就越少。年轻代相对于老年代的大小由NewRatio控制。例如,设置-XX:NewRatio=3意味着老年代和年轻代的比例为1:3,eden和survivor空间的总大小将是堆的四分之一。
默认情况下,应用程序服务器是使用 Java HotSpot Server JVM 调用的。 Server JVM 默认的 NewRatio 是 2:老年代占据堆的 2/3,新生代占据堆的 1/3。更大的新生代可以容纳更多的短期对象,从而减少对缓慢的主要收集的需求。老年代仍然足够大,足以容纳许多长期存在的对象。
调整 Java 堆大小:
确定您可以为 JVM 提供的内存总量。因此,根据年轻一代的规模绘制您自己的性能指标,以找到最佳设置。
为年轻一代提供充足的内存。默认值是根据 NewRatio 和 -Xmx 设置计算的。
更大的 eden 或年轻代空间会增加完整 GC 之间的间隔。但年轻的太空 Collection 可能需要相应更长的时间。一般来说,将 eden 大小保持在最大堆大小的四分之一到三分之一之间。老年代必须大于新生代。
关于java - java堆调优中NewRatio的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46766672/