Answers:
从Java SE 6 HotSpot [tm]虚拟机垃圾收集调优
下列
过多的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
指定每小时一次的显式收集,而不是默认的每分钟一次的速率。但是,这也可能导致某些对象需要更长的时间才能被回收。如果不希望DGC活动的及时性达到上限,则可以将这些属性设置为Long.MAX_VALUE,以有效地使显式集合之间的时间无限长。
似乎暗示确定98%的评估周期为一分钟长,但是可以使用正确的定义在Sun的JVM上进行配置。
当然,其他解释也是可能的。
-XX:+DisableExplicitGC
它也不会影响RMI相关的配置,并且系统将以参数-Dsun.rmi.dgc.server.gcInterval
-Dsun.rmi.dgc.server.gcInterval
属性自Java 1.2起就存在。