Java 8 中的默认 Full GC 间隔是多少

What is the default Full GC interval in Java 8

我们注意到我们的生产服务器(JavaEE,Wildfly 10)上有一个奇怪的行为。 Java VM 每小时执行一次 Full GC,尽管仍有足够的可用内存。

虚拟机启动参数为:

-server
-Xms4g
-Xmx8g

以下参数激活:

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

那么 Java8 中的默认 Full GC 间隔是多少?我如何将其配置为动态的?

你这么说

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

不是 "activated"。但是,这些是这些属性的默认值;即,如果您不指定属性值,您将获得这些值。

参考:Oracle 的 sun.rmi Properties 文档。

So what is the default Full GC interval in Java 8

有关 DCG 触发的完整 GC,请参见上文。

除此之外,当请求(通过 System.gc() 调用)或 JVM 认为有必要时,会发生完整的 GC。如果你没有使用 RMI,则没有固定的时间间隔。

... and how can I configure it to be dynamic?

如果你的意思是,你怎么能阻止 RMI 每小时触发一次完整的 GC:

  • 一种方法是为这些属性指定(很多)更大的值。

  • 另一种方法是使用 -XX:+DisableExplicitGC 标志启动 JVM。注意:这将禁用 allSystem.gc() 的调用,而不仅仅是 RMI 的 DGC 进行的调用。另请参阅:,了解这可能导致的一些问题。

  • 第三种方法是使用-XX:+ExplicitGCInvokesConcurrent标志。这减少了调用 System.gc() 的影响,但它只适用于支持并发收集的 GC;例如CMS,G1,ZGC or Shenandoah

    您可以调整其他东西以减少并发收集器 "stop the world" 暂停,但这超出了这个问题的范围。

另一个解决方案是设置选项

 -XX:+ExplicitGCInvokesConcurrent 

结合

 -XX:+UseG1GC

这样 System.gc() 不会被禁用,但通过使 GC 在并发模式下工作而不是导致 "stop the world" 情况的危害较小。我用它成功地将 WildFly 中的 GC 暂停时间从 10 秒减少到 500 毫秒。