我怎样才能帮助CMS GC“快死”

时间:2013-08-14 11:27:45

标签: java garbage-collection

我在我的应用程序中使用“-XX:+ UseConcMarkSweepGC”,当Out Of Memory Error关闭时,我的应用程序以自身的弱形式转换(此时它记录“并发模式失败”)。在这种形式它可以在很长一段时间内存活,这对我来说是一个很大的麻烦。我需要找到如何帮助我的应用程序“快速而轻松地死”的方法。

我用Google搜索了这个:“-XX:GCHeapFreeLimit = nnn其中nnn是介于0和100之间的数字,给出GC后必须释放的最小堆百分比。默认值为2”,但我遇到了麻烦。我使用“-XX:GCHeapFreeLimit = 50”配置我的JVM,我认为它不会改变任何东西

log 2013-08-14T17:31:49.776 + 0400:[Full GC [CMS:917504K-> 908590K(917504K),2.8014727 secs] 1032192K-> 908590K(1032192K),[CMS Perm:2071K-> ; 2071K(65536K)],2.8015412秒] [时间:用户= 2.79 sys = 0.00,真实= 2.80秒]

1032192K-> 908590K(1032192K) - 这不是50个迫害

1 个答案:

答案 0 :(得分:2)

我认为你说当你的堆接近满时,你的应用程序在垃圾收集上花费了太多时间。

如果是这样,您可以做一件简单的事情,可以提供帮助:添加-XX:+UseGCOverheadLimit命令行选项。这会导致JVM跟踪“GC开销”花费的时间。如果时间比例超过给定(可配置)比率,JVM将引发OutOfMemoryError异常。

显然,这会导致您的应用程序更快死亡。但听起来就像你想要的那样:快速死亡,而不是缓慢挥之不去。


根据this page,默认比率为98%申请,2%gc。关于可调谐比率,我可能不正确。如果没有,我怀疑它可能就是这个:-X:GCTimeLimit=nn