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

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

enter image description here

虚拟机启动参数为:

-server
-Xms4g
-Xmx8g

以下参数被激活:
-Dsun.rmi.dgc.client.gcInterval=3600000
-Dsun.rmi.dgc.server.gcInterval=3600000

Java 8中默认的Full GC间隔是多少,如何配置为动态?
2个回答

5

您说

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

这些属性默认值是未被"激活"的。也就是说,如果你没有为这些属性指定值,那么这些默认值就是你获得的值。

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

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

请见上文关于DCG触发的Full GCs。

除此之外,在不使用RMI的情况下,当请求时(通过System.gc()调用)或JVM认为有必要时会进行完整垃圾回收。没有固定的间隔时间。

... 我该如何将其配置为动态的?

如果您的意思是,如何停止RMI每隔一小时就触发一次完全GC:

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

  • 另一种方法是使用-XX:+DisableExplicitGC标志启动JVM。注意:这将禁用所有对System.gc()的调用,而不仅仅是RMI的DGC所做的调用。还可以查看:使用NIO直接缓冲区时设置-XX:+DisableExplicitGC的影响以了解可能导致的一些问题。

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

    您可以通过调整其他参数来减少并发收集器的“停顿时间”,但这超出了本问题的范围。


0
另一个解决方案是设置选项。
 -XX:+ExplicitGCInvokesConcurrent 

与之结合

 -XX:+UseG1GC

这种方式 System.gc() 不会被禁用,但通过使 GC 以并发模式工作而不是导致 "停止世界" 的情况来减少其危害性。我使用这种方法成功将 WildFly 中的 GC 暂停时间从10秒减少到500毫秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接