将最大和最小 JVM 堆大小设置为相同是否良好?
目前,在我们的测试环境中,最大和最小JVM堆大小设置为相同的值,基本上与专用服务器机器允许我们的应用程序一样多。这是性能的最佳配置,还是给 JVM 一个范围会更好?
目前,在我们的测试环境中,最大和最小JVM堆大小设置为相同的值,基本上与专用服务器机器允许我们的应用程序一样多。这是性能的最佳配置,还是给 JVM 一个范围会更好?
彼得的答案是正确的,因为这是在启动时分配的,它将增长到(最大堆大小),但他如何措辞他的答案有点误导。(对不起彼得,我知道你知道这些东西很冷)。-Xms
-Xmx
设置 ms == mx 会有效地关闭此行为。虽然这在较旧的JVM中曾经是一个好主意,但现在情况已不再如此。通过增大和收缩堆,JVM 可以适应内存压力的增加,同时通过在内存压力降低时收缩堆来减少暂停时间。有时,此行为不会为您提供预期的性能优势,在这些情况下,最好将 mx == ms 设置为毫秒。当堆超过收集所花费的时间并且集合无法恢复超过此时间时,将抛出 OOME。如果你没有达到最大堆大小,那么JVM将简单地增长,这样你就超出了这个边界。除非堆达到最大堆大小并满足定义 .98%
2%
OutOfMemoryError
OutOfMemoryError
对于自我发布以来出现的评论。我不知道JMonitor博客条目显示了什么,但这是来自收藏家。PSYoung
size_t desired_size = MAX2(MIN2(eden_plus_survivors, gen_size_limit()),
min_gen_size());
我可以做更多的挖掘,但我敢打赌,我会找到在and和实现中具有相同目的的代码。实际上,除非有 .在串行收集器将运行的情况下,这应该包括压缩,之后堆的顶部很可能是干净的,因此有资格被解除分配。ParNew
PSOldGen
CMS Tenured
Concurrent Mode Failure
CMF
设置 -Xms 的主要原因是,如果您在启动时需要某个堆。(防止在启动时发生内存不足错误。如上所述,如果您需要启动堆来匹配最大堆,则当您匹配它时。否则,您并不需要它。只需要求应用程序占用它最终可能需要的更多内存。在负载测试和使用应用程序时观察内存随时间的变化使用情况(分析),应该可以让您很好地了解需要将它们设置为什么。但是,在启动时将它们设置为相同并不是最糟糕的事情。对于我们的许多应用程序,我实际上从最小值(启动)的128,256或512开始,最大为1千兆字节(这是针对非应用程序服务器应用程序)。
刚刚在堆栈溢出上发现了这个问题,这也可能是增加最大容量和最大堆大小的副作用。值得一看。