超出了GC开销限制

时间:2010-12-06 22:18:52

标签: java garbage-collection jvm

JVM用于抛出'java.lang.OutOfMemoryError:超出GC开销限制'的采样时间是多少? 我知道你可以用参数GCTimeLimit和GCHeapFreeLimit来控制98%和2%,但是抽样时间是多少?

1 个答案:

答案 0 :(得分:82)

来自Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

以下

  

过多的GC时间和OutOfMemoryError

     

如果太多,并发收集器将抛出OutOfMemoryError   在垃圾收集中花费的时间:如果超过98%的   垃圾收集所花费的总时间不到2%   堆已恢复,将抛出OutOfMemoryError。此功能   旨在防止应用程序运行扩展   一段时间,因为堆是很少或没有进展   太小。如有必要,可以通过添加此功能来禁用此功能   选项   -XX:-UseGCOverheadLimit到命令行。

     

该策略与并行收集器中的策略相同,除了   执行并发收集所花费的时间不计入   98%的时间限制。换句话说,只有收集时执行   应用程序停止计入过多的GC时间。这样   集合通常是由于并发模式失败或   显式收集请求(例如,对System.gc()的调用)。

与进一步下来的段落相结合

  

显式垃圾最常遇到的用途之一   收集发生在RMI分布式垃圾收集(DGC)中。   使用RMI的应用程序是指其他虚拟机中的对象。   没有这些分布式应用程序就无法收集垃圾   偶尔收集本地堆,因此RMI强制完整集合   定期。可以控制这些集合的频率   有财产。例如,

java -Dsun.rmi.dgc.client.gcInterval=3600000
     

-Dsun.rmi.dgc.server.gcInterval=3600000每小时指定一次显式收集,而不是默认的每次收费率   分钟。但是,这也可能导致某些对象花费更长时间   被收回。这些属性可以设置为Long.MAX_VALUE   如果,显式集合之间的时间实际上是无限的   没有人希望DGC的及时性达到上限   活性。

似乎暗示确定98%的评估期是一分钟,但可以在Sun的JVM上配置正确的定义。

当然,其他解释也是可能的。