在内存数据库的上下文中,我们使用离堆内存来配合 hotspot 的 G1 收集器。然而,当离堆内存使用量达到 MaxDirectMemorySize 时,JDK 代码会使用 System.gc() 触发一次完整的 GC。这导致了长时间且痛苦的停顿,同时似乎将所有当前的活动对象都放入老年代,绕过了 Survivor 区(从而增加了近亲问题)。但是,当设置 -XX:+ExplicitGCInvokesConcurrent 选项时,就不会出现这种情况:GC 更快并且尊重 Survivor 区。
由于 System.gc() 是 JDK 内部使用的内容,为什么它在 hotspot 中默认没有开启这个选项呢?这个标志是否引起理论或实际问题?还是只为了兼容性原因?有没有人在生产环境中使用这个选项,并遇到了问题?
由于 System.gc() 是 JDK 内部使用的内容,为什么它在 hotspot 中默认没有开启这个选项呢?这个标志是否引起理论或实际问题?还是只为了兼容性原因?有没有人在生产环境中使用这个选项,并遇到了问题?