在内存数据库的上下文中,我们将堆外内存与热点的G1收集器结合使用。
但是,当堆外内存使用量达到MaxDirectMemorySize时,JDK代码使用System.gc()
触发完整GC。这导致世界GC的长期和痛苦的停止,似乎也把所有当前的现场设置放在了旧的,绕过了幸存者(从而增加了裙带关系问题)。设置-XX:+ExplicitGCInvokesConcurrent
时不会发生这种情况:GC更快,尊重幸存者。
由于System.gc()
是JDK内部使用的内容,为什么默认情况下此选项不在hotspot中?这面旗帜是否会引发政治或实际问题?或者只是出于兼容性原因?有没有人有在生产环境中使用此选项的经验,并遇到过它的问题?