GC超出限制

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

从Java SE 6 HotSpot [tm]虚拟机垃圾收集调整

下列

GC时间过长和OutOfMemory错误

如果在垃圾收集中花费了太多时间,并发收集器将抛出一个OutOfMemoryError:如果超过总时间的98%用于垃圾收集,并且小于2%的堆被恢复,则将抛出OutOfMemoryError。 此function旨在防止应用程序长时间运行,而由于堆太小,进行很less或没有进度。 如有必要,可以通过在命令行中添加-XX:-UseGCOverheadLimit选项来禁用此function。

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

连同下一段话

RMIs分布式垃圾回收(DGC)是显式垃圾回收最常遇到的一种使用方法。 使用RMI的应用程序引用其他虚拟机中的对象。 垃圾无法在这些分布式应用程序中收集,而不偶尔收集本地堆,因此RMI会定期强制收集全部垃圾。 这些集合的频率可以通过属性来控制。 例如,

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

-Dsun.rmi.dgc.server.gcInterval=3600000指定每小时显式收集一次,而不是每分钟一次的默认速率。 但是,这也可能导致一些物体花费更长的时间来回收。 这些属性可以设置为Long.MAX_VALUE,以使显式集合之间的时间实际上是无限的,如果不希望DGC活动的时间上限的话。

似乎意味着确定98%的评估时间是一分钟,但是可以在Sun的JVM上使用正确的定义来configuration。

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