许多 Java 虚拟机提供了选项来控制 Java 堆的大小和增长。本文讨论了如何正确设置最小值(ms)和最大值(mx)的堆大小。最小值参数是就是堆的起始大小,因此合理地设置它以及最大值参数,可能对您的 Java 应用会产生深远的影响。
我们的经验是最好的证明
一个客户最近所遇到的情况为我们提供了一个很好的例子,它说明 ms 和 mx 的不当设置可能导致哪些问题。该客户的系统是通过高速 SP 基架连接的一个多节点网络。每个节点包含 4 个 CPU,2 GB RAM。每个节点上运行 10 个 JVM。每个 JVM 都有其自己的设置,其中有个 JVM 将 ms 设为 32MB,将 mx 设为 256MB。
在启动后几分钟,系统停止运行,吞吐量几乎为零。在分析了 verbosegc 输出之后,我们调整了堆大小,将 ms 和 mx 设为 300MB。原来每个节点不能支持超过 20 个用户,这次更改后,现在可以轻松地支持 125 个用户。ms 很低的初始值会导致过多的垃圾收集和缓慢的堆增长,从而导致性能严重下降。
在所有情况下,全面了解与应用程序和所用 Java 环境的与堆相关的特征都非常重要。希望这个简短的讨论能够使您在处理您的 Java 应用程序时不会再遇到“堆问题”。