在内存数据库的情况下,我们将堆外内存与热点的G1收集器结合使用。
但是,当堆外内存使用量达到MaxDirectMemorySize时,JDK代码会使用触发完整的GC System.gc()
。这将导致世界GC长期而痛苦的停止,这似乎也将所有当前的直播设置放到了旧一代中,绕过了幸存者(从而增加了裙带关系问题)。设置时不会发生这种情况-XX:+ExplicitGCInvokesConcurrent
:GC速度更快,并且尊重幸存者。
由于System.gc()
JDK在内部使用了某些东西,为什么热点中默认不启用此选项?这个标志会引起理论上的或实际的问题吗?还是仅出于兼容性原因?是否有人在生产环境中使用过此选项,并且遇到过问题?
从表面上看,JDK人员还没有回答这个问题(请参阅Charlie Hunt在JDK-8071770上的评论)。
到目前为止,我发现使用此选项的唯一缺点是,默认情况下,并发GC不会卸载类(请参见JDK-6541037)。但是,如果这是您的问题,则可以使用-XX:+ ExplicitGCInvokesConcurrentAndUnloadsClasses。
编辑2017:针对JDK10的具有相同问题的特定票证已打开:JDK-8160392
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句