将max和min JVM堆大小设置为相同是否合适?

Cla*_*981 32 java jvm

目前在我们的测试环境中,max和min JVM堆大小设置为相同的值,基本上与专用服务器机器允许我们的应用程序一样多.这是性能的最佳配置还是让JVM的范围更好?

小智 27

彼得的答案是正确的,因为它-Xms是在启动时分配的,它会长大到-Xmx(最大堆大小),但是在他如何措辞他的答案时有点误导.(对不起彼得,我知道你知道这东西很冷).

设置ms == mx可以有效地关闭此行为.虽然这在旧JVM中曾经是一个好主意,但现在不再是这样了.增加和缩小堆允许JVM适应内存压力的增加,但通过在内存压力降低时缩小堆来减少暂停时间.有时这种行为不会给您带来预期的性能优势,在这种情况下,最好设置mx == ms. 当堆超过收集时间并且集合无法恢复时,OOME会被抛出.如果你没有达到最大堆大小,那么JVM将会增长,以便你超越这个界限.除非您的堆达到最大堆大小并满足定义的其他条件,否则您无法启动.98%2%OutOfMemoryErrorOutOfMemoryError

对于自我发布以来的评论.我不知道JMonitor博客条目显示的是什么,但这是来自PSYoung收藏家.

size_t desired_size = MAX2(MIN2(eden_plus_survivors, gen_size_limit()),
                           min_gen_size());
Run Code Online (Sandbox Code Playgroud)

我可以做更多的挖掘有关,但我敢打赌,我会发现,在有异曲同工之妙的代码ParNew,并PSOldGenCMS Tenured实现.事实上,除非有一个,否则CMS不太可能返回内存Concurrent Mode Failure.如果CMF串行收集器将运行并且应该包含一个压缩,之后堆的顶部很可能是干净的,因此有资格被解除分配.


Chr*_*ich 9

设置-Xms的主要原因是,如果启动时需要某个堆.(防止在启动时发生OutOfMemoryErrors.)如上所述,如果您需要启动堆以匹配最大堆,那么您将匹配它.否则你真的不需要它.只是要求应用程序占用它可能最终需要的更多内存.在负载测试和使用应用程序的同时观察内存使用情况(分析)应该让您对将其设置为需要的内容有一个良好的感觉.但是在启动时将它们设置为相同并不是更糟糕的事情.对于我们的很多应用程序,我实际上从最初(启动)的128,256或512和最大的1 GB(这是非应用程序服务器应用程序)开始.

刚发现这个关于堆栈溢出的问题,这也可能有助于副作用增加maxpermsize-and-max-heap-size.值得一看.


San*_*rma 5

AFAIK,将两者设置为相同的大小可以省去调整堆大小的额外步骤,如果您非常知道要使用多少堆,这可能对您有利。此外,较大的堆大小会减少 GC 调用,使其发生的次数很少。在我当前的项目(交易风险分析)中,我们的风险引擎具有 和Xmx相同Xms的值,而且相当大(大约 8Gib)。这确保了即使在调用引擎一整天之后,也几乎不会发生 GC。

另外,我在这里发现了一个有趣的讨论。