谁能解释增加 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
关于java - 增加 maxpermsize 和最大堆大小的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6902135/