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

时间:2009-11-26 15:03:17

标签: java garbage-collection jvm performance

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

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

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

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

然而,考虑到内存占用减少,我可能只需放入一个较小的最大内存量,这将使世界收藏品的尺寸缩小。

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

5 个答案:

答案 0 :(得分:7)

这个问题没有一个答案,它取决于你的应用程序在做什么以及如何管理它的对象。也许请查看How does garbage collection workParallel and concurrent garbage collectors以了解各种选项。

然后,检查Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning文档,该文档扩展了Tuning Garbage Collection with the 5.0 Java Virtual Machine文档中介绍的Java SE 6的GC调优概念和技术。

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

(编辑:看过OP的评论后,我认为从性能大师Kirk Pepperdine那里读My advice on JVM heap tuning, keep your fingers off the knobs!会是一个好主意。)

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

这是非常自动的,对我们有用:

-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

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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