在内存数据库的情况下,我们将堆外内存与热点的G1收集器结合使用。

但是,当堆外内存使用量达到MaxDirectMemorySize时,JDK代码会使用System.gc()触发完整的GC。这将导致世界GC长期而痛苦的停止,这似乎也将所有当前的直播设置放到了旧一代中,绕过了幸存者(从而增加了裙带关系问题)。设置-XX:+ExplicitGCInvokesConcurrent时不会发生这种情况:GC速度更快,并且尊重幸存者。

由于System.gc()是JDK在内部使用的,为什么热点中默认不启用此选项?这个标志会引起理论上的或实际的问题吗?还是仅出于兼容性原因?是否有人在生产环境中使用过此选项,并且遇到过问题?

最佳答案

从表面上看,JDK人员还没有回答这个问题(请参阅Charlie Hunt在JDK-8071770上的评论)。

到目前为止,我发现使用此选项的唯一缺点是,默认情况下,并发GC不会卸载类(请参见JDK-6541037)。但是,如果这是您的问题,则可以改用-XX:+ ExplicitGCInvokesConcurrentAndUnloadsClasses。

编辑2017:
针对jdk10的具有相同问题的特定故障单已经打开:JDK-8160392

关于java - 为什么-XX :+ExplicitGCInvokesConcurrent the default when using the G1 collector?不,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33832094/

10-13 21:27