-XX:MaxPermSize 带或不带 -XX:PermSize

Posted

技术标签:

【中文标题】-XX:MaxPermSize 带或不带 -XX:PermSize【英文标题】:-XX:MaxPermSize with or without -XX:PermSize 【发布时间】:2012-01-11 11:42:09 【问题描述】:

我们遇到 Java.lang.OutOfMemoryError: PermGen space 错误并查看 tomcat JVM 参数,除了 -Xms-Xmx 参数,我们还指定了 -XX:MaxPermSize=128m .经过一些分析后,我可以看到 PermGen 空间上偶尔会发生垃圾收集,从而避免它运行满。

我的问题是:除了增加-XX:MaxPermSize 之外,如果我也指定-XX:PermSize 会有什么区别?我知道总内存将是 Xmx+maxPermSize,但是当指定 -XX:MaxPermSize 时,还有其他原因为什么 -XX:PermSize 应该 存在?

如果您有处理这些 JVM 参数的实际经验,请分享。

ps。 JVM 是 HotSpot 64bit Server VM build 16.2-b04

【问题讨论】:

你只需要关心最大值,这个问题的能量浪费和熵 b/c 永远不会接近节省“完美”调整 jvm。 maxPerGen 很重要,可以指定任意高值,jvm 在实际需要之前不会提交。 【参考方案1】:

-XX:PermSize 指定将在 JVM 启动期间分配的初始大小。如有必要,JVM 最多会分配-XX:MaxPermSize

【讨论】:

真的。这也使得总内存显示为 Xmx+maxPermSize 也有所不同,这非常重要。这就是为什么我要问是否还有其他事情发生。 总内存由mx和maxperm组成。特别是您为每个线程获得一些内存(堆栈)。如果你有数千个(这不是一件好事),这可能是整体大小的 50%。当您有一些 JNI 实现(例如,其他 SAP JCO 驱动程序)时,也可能存在过多的本机堆。并且一些组件还使用了堆外直接映射内存。【参考方案2】:

通过使用-XX:PermSize-Xms 等参数,您可以调整性能——例如——应用程序的启动。我最近没有看过它,但几年前-Xms 的默认值大约是 32MB(我认为),如果您的应用程序需要的比这更多,它会触发多个填充内存周期 -完全垃圾收集 - 增加内存等,直到它加载了所需的所有内容。此循环可能不利于启动性能,因此立即分配所需的数量可以改善启动。

类似的循环应用于永久代。因此,调整这些参数可以改善启动(等等)。

警告 JVM 在分配内存、划分伊甸园空间和老年代等方面有很多优化和智能,所以不要做诸如使-Xms 等于@987654326 之类的事情@ 或 -XX:PermSize 等于 -XX:MaxPermSize,因为它将删除 JVM 可以应用于其分配策略的一些优化,因此会降低您的应用程序性能而不是提高它。

一如既往:进行重要的测量以证明您的更改实际上提高了整体性能(例如,缩短启动时间可能在使用应用程序期间对性能造成灾难性影响)

【讨论】:

谢谢。即使在其他不同的地方,我也很惊讶地看到这些观点是多么截然相反(看看@mijer 的回复)。我理解这一点,因为除非我们研究 JVM 的 c 代码,否则我们真的不知道这个标志在做什么以及它如何与另一个标志交互。这就是为什么我一直在寻找亲身体验的真实体验。 “不要做让-Xms等于-Xmx”的评论并非所有用户共享。 Tomcat 特别建议将它们设置为相同的值。 tomcatexpert.com/blog/2011/11/22/… @JohnHinnegan 将其设置为相同的值确实有其优势(例如启动期间的垃圾收集更少),但正如我在回答中所说,它会阻止 JVM 进行一些优化。在这种情况下,您要么必须忍受它,要么自己使用 JVM 的命令行选项进行这些优化。 +1 与马克,不要提前这样做。重新发布:试图解释一下为什么“set -Xms=Xmx”值如此广泛传播,我认为这是由于多年前 JVM 的自适应能力要差得多。如今,我建议在经过严格的性能测试阶段后将其作为最后的手段。事实上,JVM 在自适应方面已经做得非常好,JVM 世界知名专家,例如 Kirk Pepperdine 告诉我们,预先设置这些值就像要求音乐家用一只手绑在你的背后演奏(在训练中听到)。 @Onur iirc,从 Java 5 开始,每个版本都有改进【参考方案3】:

如果您正在进行一些性能调整,通常建议将-XX:PermSize-XX:MaxPermSize 设置为相同的值以提高JVM 的效率。

这里有一些信息:

    Support for large page heap on x86 and amd64 platforms Java Support for Large Memory Pages Setting the Permanent Generation Size

您也可以指定-XX:+CMSClassUnloadingEnabled 来启用类卸载 如果您使用的是 CMS GC,请选择此选项。可能有助于降低Java.lang.OutOfMemoryError: PermGen space的概率

【讨论】:

谢谢。即使在其他不同的地方,我也很惊讶地看到观点是如何截然相反的(看看@Mark Rotteveel 的回应)。我理解这一点,因为除非我们研究 JVM 的 c 代码,否则我们并不真正知道这个标志在做什么以及它如何与另一个标志交互。这就是为什么我一直在寻找亲身体验的真实体验。 另请参阅GC Tuning Java 6 将 -Xms 和 -Xmx 设置为相同的值可以通过从虚拟机中删除最重要的大小决定来提高可预测性。另一方面,如果您做出错误的选择,虚拟机将无法弥补。 试图解释一下为什么“set -Xms=Xmx”值如此广泛传播,我认为这是由于多年前 JVM 的自适应能力要差得多。如今,我建议在经过严格的性能测试阶段后将其作为最后的手段。事实上,JVM 在自适应方面已经做得非常好,JVM 世界知名专家,例如 Kirk Pepperdine 告诉我们,预先设置这些值就像要求音乐家用一只手绑在你的背后演奏(在训练中听到)。 我在低延迟应用程序上工作了几年。没有简单的性能秘诀,这取决于我们想要优化的内容(成本、延迟……)我经常应用 Xms=Xmx 来提高性能。当让 JVM 进行复杂计算以适应其消耗没有意义时,这种调整是相关的,因为我们预订了底层资源。显然,这需要一个认真的思考/测试阶段,不仅要在 Java 命令行上进行良好的调优,还要购买好的底层硬件。 第三个链接损坏仅供参考

以上是关于-XX:MaxPermSize 带或不带 -XX:PermSize的主要内容,如果未能解决你的问题,请参考以下文章

使用带或不带括号的 python 装饰器

带或不带存储库的 NHibernate

使用参考值作为参数,带或不带“ref”? [复制]

为啥定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制]

WordPress最近的新闻/帖子,带或不带特色图片

在 ES6 中导入带或不带大括号 [重复]