java - 大堆上最坏情况垃圾收集持续时间大约是多少

标签 java garbage-collection jvm

我需要一个关于完整垃圾收集的最长时间的经验法则。动机是能够区分有故障的 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/

相关文章:

java.util.date 到 java.sql.date 转换 NPE

java - 添加ActionListener并调用其他类中的方法

java - 返回字符串的 JNI 函数是否被垃圾收集?

java - 以编程方式(不进行字符串匹配)检查 JVM 是否使用 IPV6 或 IPV4

java - 树形图到数组。数组是否保持顺序?

java - fragment 中的返回堆栈不起作用

Java lambdas 堆转储 - lambda 实例没有被垃圾收集

Git - 为什么我的两个 Git 克隆之间的对象数量不同?

java - OpenShift上SpringBoot和Vert.X应用程序的建议容器/POD CPU大小

java - 如何修复 java.lang.UnsupportedClassVersionError : Unsupported major. 次要版本