JVM用于抛出'java.lang.OutOfMemoryError:超出GC开销限制'的采样时间是多少? 我知道你可以用参数GCTimeLimit和GCHeapFreeLimit来控制98%和2%,但是抽样时间是多少?
答案 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上配置正确的定义。
当然,其他解释也是可能的。