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

euoag5mw  于 6个月前  发布在  其他
关注(0)|答案(5)|浏览(82)

最近的JVM有很多用于垃圾收集的XX参数(例如,请参阅此处),但是哪些选项可以使客户端Swing应用程序真正执行得更好呢?
我应该注意到,在客户端java应用程序中真正让我烦恼的事情之一是停止世界垃圾收集的大延迟。在Intelli-J IDEA中,我看到它持续了三分钟或更长时间。
编辑:感谢所有的回应。只是为了报告我把CMS垃圾收集器的IDEA(这是一个很好的共同参考的类型的应用程序,大多数人阅读这个问题是熟悉的)使用设置的建议从这里。我还设置-XX:+StringCache,看看它是否会减少内存需求。
通常情况下,观察到常规运行的性能并没有下降到你可以注意到的程度。使用String Cache选项可以减少内存,但是CMS方法并不彻底,最终需要停止世界垃圾收集周期(回到三分钟等待)来清除内存(一次运行400 MB)。
然而,考虑到内存占用量的减少,我可能可以只放置一个较小的最大内存量,这将使stop the world集合的大小更小。
IDEA 8.1.4附带JDK 1.6.0_12,所以我还没有测试G1。另外,我的机器只有2个核心,所以G1的方法不会真正得到最大化。是时候找老板买一台更好的机器了;)。

js81xvg6

js81xvg61#

这个问题没有单一的答案,它在很大程度上取决于你的应用程序在做什么以及它如何管理它的对象。也许可以看看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的频率及其持续时间)。
(EDIT:在阅读了OP的评论后,我认为阅读来自性能大师Kirk Pepperdine的My advice on JVM heap tuning, keep your fingers off the knobs!将是一个好主意。)

mi7gmzs6

mi7gmzs62#

垃圾收集调优不仅仅是一门艺术,而是一门科学,它实际上取决于您的应用程序及其使用情况。如果标准的停止世界策略困扰着您,为什么不转换到CMS(并发标记和扫描)或新的G1收集器呢?
最好的方法是更改参数并附加一个分析器来检查应用程序的行为。

gcmastyq

gcmastyq3#

这是自动的,对我们来说很有效:

-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

字符串

vshtjzan

vshtjzan4#

没有“最好”的选择(如果有,任何人都会使用它,对吧?),但也许是一个选项,这有助于在您的情况下.但这里有一些提示:

  • 使用最新的虚拟机。GC代码在每次发布时都会变得更好。
  • 使用客户端jvm.dll(在jre/bin/client/中的Java 1.5中可用)。这应该是默认值。
  • 在Java中,分配和释放对象的成本很低,而保留它们的成本很高。
vsikbqxv

vsikbqxv5#

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

相关问题