7

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

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

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

4

1 回答 1

6

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

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

编辑 2017:针对 jdk10 已打开具有相同问题的特定票证:JDK-8160392

于 2015-11-23T10:35:20.377 回答