这个问题说明了一切。我们应该使用什么支持JVM GC,用什么配置来最小化应用程序中的GC影响?
编辑: Linux Ubuntu64位:
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)发布于 2012-03-27 00:20:38
从J2SE 5.0开始,默认情况下在服务器类计算机上选择并行收集器,详见文档垃圾收集器人机工程学。此外,并行收集器使用一种自动调优的方法,该方法允许指定所需的行为,而不是生成大小和其他低级调优细节。可以指定的行为包括:
最大垃圾收集暂停时间吞吐量占用(即堆大小)最大暂停时间目标是使用命令行选项-XX:MaxGCPauseMillis=指定的。这被解释为一种提示,即希望暂停时间为毫秒或更短;默认情况下,没有最大暂停时间目标。如果指定了暂停时间目标,则将调整堆大小和其他与垃圾收集相关的参数,以使垃圾收集暂停时间小于指定值。请注意,这些调整可能会导致垃圾收集器降低应用程序的总体吞吐量,并且在某些情况下无法实现所需的暂停时间目标。
摘自gc.ergonomics
发布于 2012-03-26 23:18:48
关于这个问题,你已经问了好几天了。我认为,问题的根源在于,您试图从Java平台中获得实时性能,而这些平台根本不是为提供实时性能而设计的。
如果您想要实时性能(在word的真正意义上),您需要一个实现RTSJ实时扩展的Java。列出一些实现的此页。请注意,要在Java应用程序级别获得实时性能,还需要在实时操作系统平台上运行。
另一方面,如果您只希望在没有任何强实时性能保证的情况下进行低暂停垃圾回收,那么Oracle的GC调优文档将解释如何做到这一点。见查克·弗里卡诺的答案。
但要注意的是,以这种方式取得的成就是有限度的。特别是,如果您的应用程序过于强调GC,它将无法在暂停时间内满足您的目标。优化参数的最佳设置可能是特定于平台/硬件的,以及应用程序依赖的。
没有简单的答案。
当然,也没有任何一种完全适合的配置来减少延迟。甚至对于特定的JVM版本、操作系统和硬件平台也是如此。
发布于 2012-04-09 21:33:46
为了正确配置GC,您需要了解应用程序中的对象生命周期。如前所述,没有简单的答案。对我有效的是评估年轻一代,所以大多数对象死在那里,使用CMS和设置一个起始分数,这样它就不会持续运行。以下是我的参数:
-server -Xms4000M -Xmx4000M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=60 -XX:MaxTenuringThreshold=4 -XX:MaxNewSize=384m -XX:NewSize=384m -XX:SurvivorRatio=12 -Xloggc:/opt/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
还可以使用第三方实用程序解析GC日志文件,以便查看收集器上的统计信息。
https://stackoverflow.com/questions/9881181
复制相似问题