您说
-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、ZGC或Shenandoah。
您可以通过调整其他参数来减少并发收集器的“停顿时间”,但这超出了本问题的范围。
-XX:+ExplicitGCInvokesConcurrent
与之结合
-XX:+UseG1GC
这种方式 System.gc() 不会被禁用,但通过使 GC 以并发模式工作而不是导致 "停止世界" 的情况来减少其危害性。我使用这种方法成功将 WildFly 中的 GC 暂停时间从10秒减少到500毫秒。