如何防止垃圾收集器减慢我的应用程序

时间:2011-12-15 22:38:53

标签: java garbage-collection

假设我有一个内存泄漏的应用程序。在某些时候,GC会非常努力地清除内存,并会降低我的应用程序速度。我知道如果你为JVM -XX设置这个参数:-UseGCOverheadLimit它会抛出一个OutOfMemoryException:

  

如果超过98%的总时间花在垃圾收集上,并且回收的堆少于2%。

然而,这对我来说不够好。因为我的应用程序甚至会在这些数字出现之前变得非常慢。在抛出OutOfMemoryException之前,GC将吸收CPU一段时间。我的目标是以某种方式很早地识别是否会出现最可能的问题,然后抛出OutOfMemoryexception。之后我有一些恢复策略。

好的,现在我发现了这两个额外的参数GCTimeLimit和GCHeapFreeLimit。使用它们可以调整两个引用的常量(98%和2%)。

我自己做了一些测试,就像一小段代码产生内存泄漏并使用这些设置。但我不确定如何找到正确的权衡。我希望其他人有同样的问题,并想出一个合理的解决方案,或者可能还有一些我还不知道的其他GC开关。

我感觉有点失落,因为我不是这个主题的专家,似乎有很多事情可以考虑。

3 个答案:

答案 0 :(得分:1)

您可以使用java.lang.management.MemoryUsage来确定已用内存和可用内存总量。当它接近可调GC收集阈值时,您可以抛出错误。

当然这样做有点荒谬。如果问题是您需要更多内存,请增加堆大小。更可能的问题是,当你完成它时,你不会优雅地释放内存。

答案 1 :(得分:0)

支持JVM堆并使用类似Terra Cotta's Big Memory的东西,它使用直接内存管理来扩展到垃圾收集器的范围之外。

答案 2 :(得分:0)

如果您使用的是Sun / Oracle JVM,this页面似乎是一个非常完整的GC调优入门。