建议的最大堆内存使用量是多少?推荐的垃圾收集时间?

时间:2012-06-15 16:10:50

标签: java garbage-collection heap alarm heap-memory

我最近发现我的一项服务在垃圾收集中花费了大量时间,因为最大堆大小太小。我开始之前服务就在那里,所以我没有意识到堆的大小。如果它回到某个点,我想设置一个警告警告我,但我也不想给它提供比实际需要更多的资源。您认为对垃圾收集和使用的堆百分比感到警惕的合理级别是什么?

我原以为平均堆使用率会报警约为85%,而gc / 5分钟则为100毫秒。

我知道这是基于要求和硬件,但我真的在寻找一些基准或标准来做出我的决定。

2 个答案:

答案 0 :(得分:6)

Alex Lockwood的答案说明了这一点:

  

堆内存使用量和GC时间的推荐“最高级别”尽可能少

这是误导。我实际上建议反过来。尝试压缩堆大小是一个坏主意,因为这会导致您的应用程序更频繁地运行GC,并且花费更少的时间(平均)做有用的工作。

问题基本上就是这个。当JVM用完空间来分配对象时,会运行经典(非并发)GC。然后它遍历非垃圾对象,将它们复制到不同的“空间”。运行GC循环的处理器时间在很大程度上取决于非垃圾的数量......但它实现的有用工作(它释放的空间量)与heapsize - nongarbage成比例。因此,当您挤压堆大小时,可以减少GC执行的有用工作量...对于相同的处理器时间开销。

最初的问题是:

  

我原以为平均堆使用率会报警约为85%,而gc / 5分钟则为100毫秒。

在GC CPU使用的绝对级别上设置监视器/警报可能没有用。 GC时间取决于服务器活动以及GC效率。每次服务器忙碌时,您都不希望GC警报响起。

平均堆使用率为85%是合理的警报水平,但再次将警报设置为固定水平可能会产生过多的错误警报。

另一种方法是使用JVM选项设置“在GC中花费的百分比时间”阈值,并将其与“在OutOfMemoryException上终止JVM”选项相结合,并在服务器的启动脚本中放置一个自动重启循环。然后监视重启。

答案 1 :(得分:3)

这完全取决于你所写的背景和程序。

堆内存使用量和GC时间的推荐“最高级别”尽可能少