超出 GC 开销限制

2022-08-31 11:04:13

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


答案 1

来自 Java SE 6 HotSpot[tm] 虚拟机垃圾回收调优

以下

GC 时间过长且内存不足错误

如果在垃圾回收中花费了太多时间,并发收集器将抛出一个 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 上使用正确的定义进行配置。

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


答案 2