更新:对于我来说,调整Sun虚拟机的参考文献是Java SE 6 HotSpotTM Virtual Machine Garbage Collection Tuning(这也会给您提供一种方法)。
如评论所述,人体工程学功能在调整现代JVM方面做得相当不错,应该先尝试,然后再测试更详细的控件。
如果您没有获得令人满意的结果,请设置最大堆大小并开始调整生成大小,更精确地说是Young Generation。从HotspotTM JavaTM虚拟机中垃圾回收的常见问题解答中了解:
年轻一代应该足够大,以便短寿的对象有机会在下一次年轻一代收集之前死亡。这是一个权衡,因为较大的年轻一代将允许更多时间来使对象死亡,但可能需要更长的时间来收集。尝试调整年轻一代的大小以优化年轻一代收集时间或应用程序吞吐量。
我会遵循建议的方法:
服务器应用程序的经验法则如下:
- 首先确定您可以给虚拟机的最大堆大小。然后,将性能指标与年轻代大小相对比,以找到最佳设置。
- 请注意,最大堆大小应始终小于计算机上安装的内存量,以避免过多的页面故障和磁盘交换。
- 如果总堆大小固定,则增加年轻代大小需要减少老年代大小。保持老年代足够大,以在任何给定时间使用应用程序的所有活动数据以及一定量的松弛空间(10-20%或更多)。
- 在满足上述老年代约束条件的情况下:
- 为年轻代授权足够的内存。
- 随着处理器数量的增加,增加年轻代大小,因为分配可以并行化。
如果应用程序仍未达到所需的性能,则可以尝试使用不同的收集器(参见选择收集器)。
除非您的应用程序具有相当严格的暂停时间要求,否则先运行您的应用程序并允许VM选择收集器。如果必要,调整堆大小以提高性能。如果性能仍未达到目标,则使用以下准则作为选择收集器的起点。
1. 如果应用程序具有较小的数据集(最多约100MB),则选择带有-XX:+UseSerialGC的串行收集器。
2. 如果应用程序将在单个处理器上运行且没有暂停时间要求,则让VM选择收集器,或者选择带有-XX:+UseSerialGC的串行收集器。
3. 如果(a)峰值应用程序性能是第一优先级,且(b)没有暂停时间要求或可接受一秒钟或更长时间的暂停,则让VM选择收集器,或者选择带有-XX:+UseParallelGC和(可选)启用-XX:+UseParallelOldGC的并行收集器。
4. 如果响应时间比总吞吐量更重要,并且垃圾收集暂停必须保持短于约一秒钟,则选择带有-XX:+UseConcMarkSweepGC的并发收集器。如果只有一个或两个处理器可用,请考虑使用下面描述的增量模式。
实际上,仔细阅读整个文档(并确保理解做出糟糕决定的影响 :)),不要忘记:
如果不能测量它,就不能改进它。--开尔文勋爵
参考资料
以下是我最初的答案,一些读者可能仍然会觉得有趣:
Java性能调优是一个广为人知的Java性能参考,仍在更新。你可能还想查看Kirk Pepperdine的博客(他实际上是前一个网站的贡献者)。