目前在我们的测试环境中,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,并PSOldGen与CMS Tenured实现.事实上,除非有一个,否则CMS不太可能返回内存Concurrent Mode Failure.如果CMF串行收集器将运行并且应该包含一个压缩,之后堆的顶部很可能是干净的,因此有资格被解除分配.
设置-Xms的主要原因是,如果启动时需要某个堆.(防止在启动时发生OutOfMemoryErrors.)如上所述,如果您需要启动堆以匹配最大堆,那么您将匹配它.否则你真的不需要它.只是要求应用程序占用它可能最终需要的更多内存.在负载测试和使用应用程序的同时观察内存使用情况(分析)应该让您对将其设置为需要的内容有一个良好的感觉.但是在启动时将它们设置为相同并不是更糟糕的事情.对于我们的很多应用程序,我实际上从最初(启动)的128,256或512和最大的1 GB(这是非应用程序服务器应用程序)开始.
刚发现这个关于堆栈溢出的问题,这也可能有助于副作用增加maxpermsize-and-max-heap-size.值得一看.
| 归档时间: |
|
| 查看次数: |
33576 次 |
| 最近记录: |