从Java5迁移到6后GC行为的变化

我们最近将我们的系统从Sun Java 5迁移到Java6服务器VM(特别是Linux 32位上的1.6.0_16)。 我们已经注意到垃圾收集行为已经发生变化,从而触发了我们的堆警告监控系统。

堆使用情况图表显示了比我们在Java5中看到的更“尖峰”的内存使用情况,在运行大型GC之前,VM允许堆使用率非常高。 它似乎不是应用系统本身的问题(它实际上从来没有用完内存),但是当使用峰值接近阈值时,它会给监控系统偶尔发出虚假的“发火”信号。

我们可以增加堆最大值并希望峰值不会变得更大,但我更愿意找出是否有一种方法可以调整JVM参数,使得我们获得更平滑的配置文件,即使我们松散一点性能。

我猜我们可以设置一些-XX选项来实现这个目标,但我在文档中看不到任何这样的东西。 有人知道这样的选择吗?

听起来你真的想拥有更像是并发集合的东西(而不是标准的大爆炸集合):

并发收集器是为那些喜欢较短的垃圾收集暂停并且能够在应用程序运行时与垃圾收集器共享处理器资源的应用程序而设计的。

也许更重要的是,除了特定的垃圾收集选项之外,您应该确保使用正确的VM以及正确的选项。 例如,我在自己的生活中多次绊倒客户端与服务器VM问题。

玩得开心阅读和玩耍(Java 6 GC调校:-)

您能否确认采用相同的GC方案/机制? 您是否计算1.6中更高的GC开销,或者在任何给定的持续时间内停顿时间更长?

最大和最小堆免费指令也可能有助于您的一些堆人体工程学。

-XX:MinHeapFreeRatio-XX:MaxHeapFreeRatio

http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#generation_sizing.total_heap