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

die*_*ter 5 java jboss garbage-collection wildfly

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

在此处输入图片说明

VM启动参数为:

-server
-Xms4g
-Xmx8g
Run Code Online (Sandbox Code Playgroud)

以下参数激活:

-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
Run Code Online (Sandbox Code Playgroud)

那么Java 8中默认的Full GC间隔是什么?如何将其配置为动态?

Ste*_*n C 5

你说

-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000
Run Code Online (Sandbox Code Playgroud)

没有“激活”。但是,这些是这些属性的默认值;即,如果您不为属性指定值,则您获得的值。

参考:Oracle 的sun.rmi 属性文档。

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

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

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

...以及如何将其配置为动态的?

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

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

  • 另一种方法是使用-XX:+DisableExplicitGC标志启动 JVM 。注意:这将禁用所有调用,System.gc()而不仅仅是 RMI 的 DGC 发出的调用。另请参阅:当使用 NIO 直接缓冲区时设置 -XX:+DisableExplicitGC 的影响可能会导致一些问题。

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

    您可以潜在地调整其他内容以减少并发收集器“停止世界”的暂停,但这超出了本问题的范围。