我们最近将我们的系统从Sun Java 5迁移到Java6服务器VM(特别是Linux 32位上的1.6.0_16)。我们注意到垃圾收集行为已经发生变化,从而触发了我们的堆警告监控系统。
堆使用情况图表显示了比我们在Java5中看到的更“尖峰”的内存使用情况,在运行大型GC之前,VM允许堆使用率非常高。它似乎不是应用系统本身的问题(它从来没有实际耗尽内存),但它会给监控系统偶尔的虚假“发火”信号,只要使用峰值接近阈值。
我们可能增加堆最大值并希望峰值不会变得更大,但我更愿意找出是否有一种方法可以调整JVM参数,使得即使我们放松了一点性能,我们也能获得更平滑的配置文件。
我猜我们可能会设置一些-XX选项来实现这一目标,但我在文档中看不到任何这样的东西。有人知道这样的选择吗?
答案 0 :(得分:3)
听起来你真的希望有更像concurrent collection的东西(而不是标准的大爆炸集合):
设计了并发收集器 对于喜欢较短的应用程序 垃圾收集暂停,那可以 负担得起共享处理器资源 与垃圾收集器同时 应用程序正在运行。
或许更重要的是,除了特定的垃圾收集选项之外,您应该确保使用正确的VM以及正确的选项。例如,我在自己的生活中多次跳过client vs. server VM问题。
答案 1 :(得分:2)
答案 2 :(得分:1)
您能确认使用相同的GC方案/机制吗?您是否计算1.6中更高的GC开销,或者在任何给定的持续时间内停顿时间更长?
Max和min heap free指令也可能有助于你的一些堆人体工程学。
-XX:MinHeapFreeRatio
和-XX:MaxHeapFreeRatio
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#generation_sizing.total_heap