1

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

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

日志 2013-08-14T17:31:49.776+0400: [完整 GC [CMS: 917504K->908590K(917504K), 2.8014727 秒] 1032192K->908590K(1032192K), [CMS Perm : (65536->2071K) , 2.8015412 secs] [Times: user=2.79 sys=0.00, real=2.80 secs]

1032192K->908590K(1032192K) - 这不是 50 分

4

1 回答 1

2

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

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

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


根据this page,默认比例为98% application,2% gc。我可能不正确地认为比率是可调的。如果不是,我怀疑它可能是这个:-X:GCTimeLimit=nn

于 2013-08-14T11:58:14.823 回答