我需要一个关于完整垃圾收集的最长时间的经验法则。动机是能够区分有故障的 JVM 进程和处于 GC 下的进程。
假设我有一个常规的通用服务器硬件,HotSpot JVM 8,堆大小为20G-40G,没有设置特定的GC和内存选项。 GC 完成的合理时间限制是多少?是 5 分钟、20 分钟还是长达数小时?
更新: 我的应用程序是处理大数据结构的内存密集型离线作业。我根本不需要调整GC。如果知道这个限制,10 秒和 10 分钟的暂停是没有问题的。
最佳答案
量化 GC“应该”花费多长时间是非常困难的,因为它取决于许多因素:
- 堆有多大。
- 堆有多满;即运行 GC 时垃圾与非垃圾的比率。
- 有多少个指针/引用需要遍历。
- 您使用的是哪个 GC。
- 无论是次要的“新一代”集合、主要的“老一代集合”还是“完整”集合。当低延迟收集器无法跟上垃圾生成速度时,最后一个通常由后备收集器执行。
- 是否发生物理<->虚拟内存抖动。
有几种病理情况可能会导致 GC 时间过多:
如果堆几乎已满,GC 会使用越来越多的时间来尝试回收最后一位可用空间。
如果堆大于可用物理内存,则可能会出现虚拟内存“颠簸”行为。这在主要或完整 GC 期间最为明显。
如果您确实需要选择一个数字,我建议您使用一个“感觉”适合您的数字,并将其作为配置参数,以便于调整。另外,打开 GC 日志记录并查看其中报告的典型 GC 时间。 (特别是当服务器负载很高时。)
关于java - 大堆上最坏情况垃圾收集持续时间大约是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45975605/