为什么在使用G1收集器时-XX:+ExplicitGCInvokesConcurrent不是默认设置?

7
在内存数据库的上下文中,我们使用离堆内存来配合 hotspot 的 G1 收集器。然而,当离堆内存使用量达到 MaxDirectMemorySize 时,JDK 代码会使用 System.gc() 触发一次完整的 GC。这导致了长时间且痛苦的停顿,同时似乎将所有当前的活动对象都放入老年代,绕过了 Survivor 区(从而增加了近亲问题)。但是,当设置 -XX:+ExplicitGCInvokesConcurrent 选项时,就不会出现这种情况:GC 更快并且尊重 Survivor 区。
由于 System.gc() 是 JDK 内部使用的内容,为什么它在 hotspot 中默认没有开启这个选项呢?这个标志是否引起理论或实际问题?还是只为了兼容性原因?有没有人在生产环境中使用这个选项,并遇到了问题?
1个回答

6
从目前看来,JDK的工作人员似乎还没有回答这个问题(请参见Charlie Hunt在JDK-8071770上的评论)。
到目前为止,我发现使用此选项的唯一缺点是默认情况下并发GC不会卸载类(请参见JDK-6541037)。但如果这是您的问题,您可以使用-XX:+ ExplicitGCInvokesConcurrentAndUnloadsClasses。
编辑2017: 一个具有相同问题的特定票据已经为jdk10打开:JDK-8160392

1
我刚刚发现了一个情况,G1垃圾回收器不幸地忽略了ExplicitGCInvokesConcurrentAndUnloadsClasses参数 -- 由于G1将执行类卸载,最好使用ExplicitGCInvokesConcurrent。 - BobMcGee

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