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

dim*_*sli 50 java jvm permgen jvm-hotspot

我们遇到了Java.lang.OutOfMemoryError:PermGen空间错误并查看了tomcat JVM参数,除了我们还指定的-Xms-Xmxparams之外-XX:MaxPermSize=128m.经过一些分析后,我偶尔可以看到PermGen空间上发生的垃圾收集,使其无法完全运行.

我的问题是:除了增加-XX:MaxPermSize我指定的差异之外,还有-XX:PermSize什么呢?我知道总的内存中,然后将XMX + MaxPermSize参数,但是否有其他原因,-XX:PermSize应该不是的时候是有-XX:MaxPermSize规定的?

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

PS.JVM是HotSpot 64位服务器VM build 16.2-b04

tob*_*yer 44

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

  • 总内存由mx和maxperm组成.特别是你为每个线程获得一些内存(堆栈).如果你有数千(这不是一件好事),这可能高达整体规模的50%.当您有一些JNI实现时(例如,oder SAP JCO驱动程序),可能还存在过多的本机堆.而且一些组件使用堆外直接映射内存. (4认同)
  • 真正.它的不同之处在于总内存显示为Xmx + maxPermSize,这非常重要.这就是为什么我在问是否还有其他事情发生. (2认同)

Mar*_*eel 25

通过使用参数-XX:PermSize,-Xms您可以调整应用程序的启动性能 - 例如 - 启动.我最近没有看过它,但几年后默认值-Xms是32MB(我认为),如果你的应用程序需要的不仅仅是它会触发一些循环的填充内存 - 完全垃圾收集 - 增加内存等,直到它加载了所需的一切.此循环可能对启动性能有害,因此立即分配所需的数量可以改善启动.

类似的循环适用于永久世代.因此,调整这些参数可以改善启动(以及其他).

警告 JVM在分配内存,划分eden空间和老一代等方面有很多优化和智能,所以不要做-Xms等于-Xmx-XX:PermSize等于的事情,-XX:MaxPermSize因为它会删除JVM可以应用的一些优化因此,它的分配策略会降低您的应用程序性能,而不是改进它.

一如既往:进行非平凡的测量,以证明您的更改实际上总体上提高了性能(例如,改善启动时间对于应用程序的使用期间的性能可能是灾难性的)

  • 谢谢.我很惊讶地发现即使在其他各个地方,观点与观点截然相反(看看@mijer的反应).我理解这一点,因为除非我们研究JVM的c代码,否则我们不知道这个标志正在做什么以及它如何与另一个标志进行交互.这就是我寻找实际操作体验的原因. (2认同)
  • 与Mark +1,不要事先做。重新发布:尝试稍微解释一下为什么“ set -Xms = Xmx”值如此之大的原因,我认为这是由于很多年前JVM的自适应能力差很多的缘故。如今,我建议在经过严格的性能测试之后,作为最后的手段。确实,JVM在自适应方面已经取得了很好的成绩,并且JVM世界闻名的专家,例如Kirk Pepperdine告诉我们,预先设置这些值就像要求音乐家用一只手绑在你的背上演奏(在训练中听过)一样。 (2认同)

szh*_*hem 7

如果你正在做一些性能调优它通常建议同时设置-XX:PermSize-XX:MaxPermSize以相同的值,以提高JVM效率.

以下是一些信息:

  1. 支持x86和amd64平台上的大页堆
  2. Java支持大内存页面
  3. 设置永久生成大小

如果使用,还可以指定-XX:+CMSClassUnloadingEnabled启用类卸载选项CMS GC.它可能有助于降低概率Java.lang.OutOfMemoryError: PermGen space

  • 另请参阅[GC Tuning Java 6](http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html)_将-Xms和-Xmx设置为相同的值可通过删除来自虚拟机的最重要的大小决策.另一方面,如果做出糟糕的选择,虚拟机无法补偿._ (2认同)