客户端最好的垃圾收集设置是什么?

最近的JVM有很多用于垃圾收集的XX参数(例如参见这里 ),但有哪些选项可以使客户端Swing应用程序真正表现更好?

我应该注意到,在客户端java应用程序中真正让我恼火的事情之一是停止世界垃圾收集的大延迟。 在Intelli-J IDEA中,我看到它需要三分钟或更长时间。

编辑:感谢所有的回复。 只是为了报告我使用此处设置的设置,为IDEA提供了CMS垃圾收集器(这是大多数读这个问题的人都熟悉的应用程序类型的一个很好的通用参考)。 我还设置-XX:+ StringCache以查看它是否会降低内存要求。

一般来说,观察是常规运行性能不会降低到可以注意到它的程度。 使用字符串缓存选项可以减少内存,但是CMS方法并不彻底,最终需要停止世界垃圾收集周期(回到三分钟等待)以清除内存(一次运行400MB)。

然而,考虑到内存占用减少,我可能只需要放置一个较小的最大内存量,这样可以使世界各地的大小更小。

IDEA 8.1.4附带JDK 1.6.0_12,所以我还没有测试G1。 此外,我的机器只有2个核心,因此G1方法不会真正最大化。 是时候打击老板换一台更好的机器了;)。

这个问题没有单一的答案,它高度取决于您的应用程序正在做什么以及它如何管理它的对象。 也许看看垃圾收集如何工作以及并行和并发垃圾收集器来理解各种选项。

然后,检查Java SE 6 HotSpot [tm]虚拟机垃圾收集调优文档,该文档扩展了使用5.0 Java虚拟机文档在Tuning Garbage Collection中引入的Java SE 6的GC调优概念和技术。

如果您希望将垃圾收集暂停时间缩短,则并发收集器可能是正确的方向,因为它同时执行大部分工作(即,在应用程序仍在运行时)。 但找到最佳设置将需要分析(考虑测量GC吞吐量,最大和平均暂停时间,完整GC的频率及其持续时间)。

(编辑:读过OP的评论后,我认为阅读我对JVM堆调整的建议,让你的手指脱离旋转!来自性能大师Kirk Pepperdine将是一个好主意。)

垃圾收集调整不仅仅是一种艺术,而是科学,它实际上取决于您的应用程序及其用法。 如果标准的世界末日策略打扰你,为什么不转换为CMS(并发标记和扫描)或新的G1收集器?

最好的方法是更改​​参数并附加分析器以检查应用程序行为。

这是非常自动的,适合我们:

-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log 

没有“最佳”选项(如果有的话,任何人都会使用它,对吗?)但也许是一个有助于你的情况的选项。 但这里有一些提示:

  • 使用最新的VM。 每次发布时,GC代码都会变得更好。
  • 使用客户端jvm.dll(在jre/bin/client/可用的sinve Java 1.5)。 这应该是默认值。
  • 在Java中分配和释放对象很便宜。 保持它们是昂贵的。

如果你想要更好的性能,那么让垃圾收集器更少工作。 考虑使用对象池而不是不断创建和转储它们,并确保您需要创建的每个对象。