Java 为什么不是';t-XX:+;使用G1采集器时的默认值是什么?

Java 为什么不是';t-XX:+;使用G1采集器时的默认值是什么?,java,jvm-hotspot,g1gc,Java,Jvm Hotspot,G1gc,在内存数据库的上下文中,我们将堆外内存与hotspot的G1收集器结合使用 但是,当堆外内存使用达到MaxDirectMemorySize时,JDK代码使用System.GC()触发一个完整的GC。这导致了一个漫长而痛苦的世界GC停止,这似乎也把所有当前的现场设置都放在了老一代,绕过了幸存者(从而增加了裙带关系问题)。当设置-XX:+ExplicitGCInvokesConcurrent时不会发生这种情况:GC速度更快,并且尊重幸存者 既然System.gc()是JDK内部使用的东西,为什么在h

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

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


既然
System.gc()
是JDK内部使用的东西,为什么在hotspot中默认情况下不启用此选项?这面旗帜会引发理论或实际问题吗?还是仅仅出于兼容性的原因?是否有人有在生产环境中使用此选项的经验,并且遇到过问题

从表面上看,JDK的人也没有回答这个问题(参见Charlie Hunt的评论)

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

2017年编辑:
对于jdk10,有一个问题是相同的:

我刚刚发现一个例子,G1垃圾收集忽略了ExplicitGCInvokesConcurrent和UnloadsClasses参数,不幸的是——由于G1将进行类卸载,最好是进行ExplicitGCInvokesConcurrent