【发布时间】:2015-02-18 06:20:13
【问题描述】:
我有一个java 应用程序运行,最大堆大小为 8 GB。
在 32 GB 内存上,旧一代的切片为 7.4 GB(大约)。在 128 GB 内存中,相同的应用程序获得 6.2 GB(大约)的 Old Gen 切片。
我想知道JVM 在内部是如何做到的?有没有它使用的数学。实际上,我正处于GC 调整阶段,如果我知道这个数字是如何默认到达的,将会很有帮助。我使用JDK 1.7。
【问题讨论】:
我有一个java 应用程序运行,最大堆大小为 8 GB。
在 32 GB 内存上,旧一代的切片为 7.4 GB(大约)。在 128 GB 内存中,相同的应用程序获得 6.2 GB(大约)的 Old Gen 切片。
我想知道JVM 在内部是如何做到的?有没有它使用的数学。实际上,我正处于GC 调整阶段,如果我知道这个数字是如何默认到达的,将会很有帮助。我使用JDK 1.7。
【问题讨论】:
它与系统中的总 RAM 无关。 GC 比率会影响各个区域中可以存在的内存量。
-XX:NewRatio=n 旧/新代大小的比率。默认值为 2。
-XX:SurvivorRatio=n 伊甸园/幸存者空间大小的比率。默认值为 8。
-XX:MaxHeapFreeRatio=70 GC 后最大可用堆百分比以避免收缩。
使用前 2 个比率在 VM 内部调整堆的比率。使用空闲堆比率来调整堆可以增长/缩小的内存量。
推荐阅读——Oracle提供GC tuning guide。
【讨论】: