java - 增加 maxpermsize 和最大堆大小的副作用

标签 java jvm

谁能解释增加 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/

相关文章:

java - 使用自定义 SSLSocketFactory 时出现 ClassNotFoundException

java - 如何在 OGS 中实现 session Bean 的集群、负载平衡和故障转移

java - 如果我们在年轻代上标记了所有死亡对象后就知道了它们,为什么我们需要在老一代中专门搜索无法访问的对象呢?

java - 当页面导航到其他页面时如何关闭 mac 中的 java 控制台?

java - 我正在从 onClickListener 中删除一个方法并单独调用它,然后它导致了问题

java - 用 BFS 算法求解猴子和香蕉

java - 单核和多核上的线程执行

java - 在 Java 中激活其他进程的窗口

java - 在 Android 中使用 SSL 证书

java - 当分析 session 结束时,类检测是否会被删除?