增加最大容量和最大堆大小的副作用
任何人都可以解释增加最大容量和最大堆大小的副作用吗?
我知道有时,当我们遇到失记问题时,我们会增加-Xmx。但我只是想知道当我们增加-Xmx时,我是否需要记住任何副作用。增加最大渗透率如何影响运行时?
谢谢。
任何人都可以解释增加最大容量和最大堆大小的副作用吗?
我知道有时,当我们遇到失记问题时,我们会增加-Xmx。但我只是想知道当我们增加-Xmx时,我是否需要记住任何副作用。增加最大渗透率如何影响运行时?
谢谢。
简短的回答
将 java 堆大小加倍,垃圾回收暂停的等待时间加倍,使用当前的 JVM 技术,当堆按 Gb 顺序排列时,等待时间将变为多秒。似乎新发布的Java 7将改变这一点。
长答案
MaxPermSize 是永久生成堆的最大大小,永久生成堆是一个保存类的字节代码的堆,并与包含实际实例的对象堆分开。对于Web应用程序,要记住的一件事是,在每次热重新部署中,随着相同类的多个副本,此内存使用量将会增加。除非指定了 -XX:+CMSClassUnloadIngEnabled。
必须设置最大堆大小 (-Xmx) 和 MaxPermSize,同时考虑应用程序类和实例所需的内存量、服务器的总内存以及其他应用程序所需的内存。
另一个要点是,从最小堆大小 (-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
通过更改以下设置解决。文件 -->选项 -->信任中心 -->信任中心设置 --> 外部内容 --> 为所有工作簿链接启用自动更新。
--谢谢