java – 为什么不使用G1收集器时-XX:ExplicitGCInvokesConcurrent是默认值?

在内存数据库的上下文中,我们将堆外内存与热点的G1收集器结合使用.

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

由于System.gc()是JDK内部使用的东西,为什么默认情况下此选项不在hotspot中?这面旗帜是否会引发政治或实际问题?或者只是出于兼容性原因?有没有人有在生产环境中使用此选项的经验,并遇到过它的问题?

最佳答案 从它看来,JDK人们还没有回答这个问题(见
JDK-8071770年查理亨特的评论).

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

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

点赞