堆大小:错误的堆大小产生的 堆问题来源: 发布时间:星期日, 2009年3月29日 浏览:0次 评论:0
许多 Java 虚拟机提供了选项来控制 Java 堆大小和增长本文讨论了如何正确设置最小值(ms)和最大值(mx)堆大小最小值参数是就是堆起始大小因此合理地设置它以及最大值参数可能对您 Java 应用会产生深远影响
mx 参数 在大多数情况下如果您认为堆对于 Java 应用太小就应该设置 mx 参数通过在 Java 命令行上监视使用 verbosegc 参数运行 JVM 输出您可以确定垃圾收集是否过于频繁如果垃圾收集过于频繁则请尝试增大堆大小 般来说如果应用不断出现内存不足则我们建议您增大 mx 参数这些可能是由于 Java 堆中可用空间不足而引起 尽管设置堆大小没有规则可循但下列原则可能会有所帮助: 不要使堆增长超过系统物理内存换句话说决不要将 mx 堆大小设置为大于 [(物理内存) - (操作系统和应用工作区大小)]另外如果您运行多个 JVM所有堆大小总和应小于上述计算值 如果应用需要堆大于总物理内存半则请设置 mx 参数在 IBM Developer Kit for WindowsJava Technology Edition, 版本 1.1.8 中mx 参数默认值是总物理内存大小半 如果您应用经常依赖于终止 (finalizer) 操作则需要减小 mx 设置大小(注:我们建议您避免这种代码设计) 在 IBM Developer Kit for WindowsJava Technology Edition 中对堆增长有更好支持对于 Java 服务器应用如果您发现没有达到最优性能我们建议您检查堆大小IBM 通过智能地增大堆解决了这普遍存在 Java 问题这种技术在 IBM Developer Kit for WindowsJava Technology Edition1.1.7 版本中首次出现并在 IBM Developer Kit for Windows and OS/2 WarpJava Technology Edition1.1.8 版本中得到增强有了这些 JVM用户几乎不需要设置堆大小;和智能增长搭配默认值般就足够了 可能负面影响 增大堆大小可以提高吞吐量但会增加停顿时间这是搜集大型堆可能需要几秒钟时间但垃圾收集次数会减少尽管这种偶然响应时间变长对于直接通过 LAN 和服务器连接客户机至关重要但以响应时间变长来换取吞吐量增加是值得堆大小是个体系结构问题它取决于应用用途在 IBM Developer Kit for Windows and OS/2 WarpJava Technology Edition1.1.8 版本中垃圾收集和堆增长管理都是基于活动对象因此停顿时间对性能影响比在 1.1.7 版本中更小 始终追求最好 查找最佳堆大小可能需要对应用、 Java 实现和操作系统作些试验确定具体应用最佳堆大小范围种思路方法是将 mx 设置得非常大然后用 verbosegc 选项运行应用这将产生有关堆使用情况输出您可以分析这个输出以便对堆大小作出明智决策 另种思路方法需要完成更多工作但它使系统维护更容易;这种思路方法就是确定服务器上工作单元即服务器完成工作个完整周期例如在批处理系统中个工作单元是批请求在更为典型客户机/服务器信息检索周期中工作单元可能是典型客户随其登录/退出序列同提交系列请求过程如下: 代码 .gc 工作单元 关闭异步垃圾收集和类垃圾收集(在命令行使用 -noasyncgc -nogc) 使用个合成驱动使服务器反复执行此工作单元 采用电子表格分析 verbosegc 输出以确定完成平均工作单元所需堆大小 将这个堆大小乘以工作单元数(例如在指定时间内希望服务器处理用户数或批处理数)并加上应用所需基本堆大小当然还有不很著名"虚构因子" 所生成数字就是 mx 设置这种思路方法需要完成更多工作但是当服务器实际负载改变时堆大小随时可以调整 ms 参数 ms 参数更为简单如果您担心内存利用率和扩展开销则请将 ms 值设为 mx 值否则就不要设置 ms请注意在 IBM Developer Kit for Windows and OS/2 WarpJava Technology Edition1.1.8 版本中堆大小既可以减小也可以增大因此如果 ms 被设为某值堆则不能减小到该值以下 我们经验是最好证明 个客户最近所遇到情况为我们提供了个很好例子它介绍说明 ms 和 mx 不当设置可能导致哪些问题该客户系统是通过高速 SP 基架连接个多节点网络每个节点包含 4 个 CPU2 GB RAM每个节点上运行 10 个 JVM每个 JVM 都有其自己设置其中有个 JVM 将 ms 设为 32MB将 mx 设为 256MB 在启动后几分钟系统停止运行吞吐量几乎为零在分析了 verbosegc 输出的后我们调整了堆大小将 ms 和 mx 设为 300MB原来每个节点不能支持超过 20 个用户这次更改后现在可以轻松地支持 125 个用户ms 很低值会导致过多垃圾收集和缓慢堆增长从而导致性能严重下降 在所有情况下全面了解和应用和所用 Java 环境和堆相关特征都非常重要希望这个简短讨论能够使您在处理您 Java 应用时不会再遇到“堆问题” TAG: 堆问题 0
相关文章读者评论发表评论 |
|