对于希望最大限度地减少常规 Sun/Oracle 热点 JVM 上的 GC 延迟的实时系统,最好的 GC 和内存配置是什么?

这个问题几乎说明了一切。我们应该使用哪些受支持的 JVM GC,以及使用什么配置来最大程度地减少 GC 对应用程序的影响?

编辑:Linux Ubuntu 64 位:

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

答案 1

从 J2SE 5.0 开始,缺省情况下,在服务器级机器上选择并行收集器,如文档垃圾回收器人体工程学中所述。此外,并行收集器使用自动调整方法,该方法允许指定所需的行为,而不是代大小和其他低级调整细节。可以指定的行为包括:

最长垃圾回收暂停时间吞吐量占用空间(即堆大小)最大暂停时间目标使用命令行选项 -XX:MaxGCPauseMillis= 指定。这被解释为需要毫秒或更短的暂停时间的提示;默认情况下,没有最大暂停时间目标。如果指定了暂停时间目标,则会调整堆大小和其他与垃圾回收相关的参数,以尝试使垃圾回收暂停时间短于指定的值。请注意,这些调整可能会导致垃圾回收器降低应用程序的总体吞吐量,并且在某些情况下无法满足所需的暂停时间目标。

摘自 http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#par_gc.ergonomics


答案 2

几天来,您一直在询问有关此问题的问题。我认为你问题的根源在于你正试图从Java平台中获得实时性能,而这些平台根本不是为提供它而设计的。

如果你想要实时性能(在真正意义上),你需要一个实现RTSJ实时扩展的Java VM。此页面列出了一些实现。请注意,要在 Java 应用程序级别获得实时性能,您还需要在具有实时功能的操作系统平台上运行。


另一方面,如果您只想要低暂停垃圾回收而没有任何强大的实时性能保证,那么Oracle的GC调整文档将解释如何做到这一点。看看查克·弗里卡诺的答案。

但要注意,以这种方式可以实现的目标有限。特别是,如果您的应用程序对 GC 的压力过大,它将无法满足您的暂停时间目标。调整参数的最佳设置可能是特定于平台/硬件的,并且取决于应用程序。

没有简单的答案。

当然,没有一刀切的配置可以最大限度地减少延迟。甚至不适用于特定的JVM版本,操作系统和硬件平台。


推荐