【发布时间】:2011-08-01 17:32:25
【问题描述】:
谁能解释增加 maxpermsize 和 max heap size 的副作用?
我知道有时,当我们遇到内存不足问题时,我们会增加 -Xmx。但我只是想知道当我们增加 -Xmx 时是否需要记住任何副作用。以及增加 maxpermsize 对运行时有何影响?
谢谢。
【问题讨论】:
谁能解释增加 maxpermsize 和 max heap size 的副作用?
我知道有时,当我们遇到内存不足问题时,我们会增加 -Xmx。但我只是想知道当我们增加 -Xmx 时是否需要记住任何副作用。以及增加 maxpermsize 对运行时有何影响?
谢谢。
【问题讨论】:
简答
Java 堆大小加倍,垃圾收集暂停的等待时间加倍,使用当前的 JVM 技术,当堆处于 Gb 顺序时,等待时间变为数秒。好像是新发布的Java 7 is going to change that。
长答案
MaxPermSize 是永久代堆的最大大小,该堆保存类的字节码,并与包含实际实例的对象堆分开。对于 Web 应用程序要记住的一件事是,在每次热重新部署中,内存使用量将随着相同类的多个副本而增加。除非指定了 -XX:+CMSClassUnloadingEnabled。
最大堆大小 (-Xmx) 和 MaxPermSize 必须考虑到应用程序类和实例需要多少内存、服务器的总内存和其他所需的内存应用程序。
另一个重要的一点是,从 Min Heap Size (-Xms) 扩展内存是一项代价高昂的操作。尤其是在财务申请的情况下,这可能意味着延误。对于类似的实时要求,最好将 -Xms 和 -Xmx 设置为相同的值。
下面的谈话可能会感兴趣http://www.infoq.com/presentations/Java-without-the-GC-Pauses
从演讲中您可以看出,将堆增加超过一定限制 2Gb、10Gb、100Gb 的副作用意味着垃圾收集的暂停时间更长,如果堆非常大,可能会停止一切几秒钟或一分钟.
出于这个原因,使用当前的 JVM 技术,您希望将堆设置为足够大以运行您的应用程序,但又不能太大。一种找到正确大小的方法,可以将其设置为最大可能值,然后减半并继续减半直到发现问题,当你这样做时,将最后找到的值加倍并将其保持为所选堆大小用于生产。
这个建议当然适用于大堆,以 Gb 顺序排列,如果您的应用程序在 256Mb 内存下运行良好,我会保留该值而无需进一步调查。
最后,这里有一些示例设置供参考:
-Xms512m -Xmx512m -XX:MaxPermSize=256m -XX:+CMSClassUnloadingEnabled
【讨论】:
通过更改以下设置解决。 文件--> 选项--> 信任中心--> 信任中心设置--> 外部内容--> 为所有工作簿链接启用自动更新。
--谢谢
【讨论】: