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

我们遇到了Java.lang.OutOfMemoryError:PermGen空间错误,并查看了除了-Xms-Xmx参数之外的tomcat JVM参数,我们也指定了-XX:MaxPermSize=128m 。 经过一些分析后,我可以偶尔看到在PermGen空间上发生的垃圾回收,从而节省了运行时间。

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

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

PS。 JVM是HotSpot 64位服务器VM版本16.2-b04

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

通过播放参数-XX:PermSize-Xms ,可以调整应用程序启动的性能。 我最近没看过,但几年前-Xms的默认值是32MB(我认为),如果你的应用程序需要更多的时间,它会触发一些循环的填充内存 – full垃圾收集 – 增加内存等,直到它已经加载所需的一切。 这个周期可能对启动性能不利,所以立即分配所需的数量可以改善启动。

永久的一代也采用了类似的循环。 所以调整这些参数可以改善启动(等等)。

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

一如既往:进行不重要的测量,以certificate您的更改实际上可以提高整体性能(例如,改善启动时间对于应用程序使用期间的性能可能是灾难性的)

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

这里是一些信息:

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

如果您使用的是CMS GC还可以指定-XX:+CMSClassUnloadingEnabled以启用class级卸载选项。 这可能有助于降低Java.lang.OutOfMemoryError: PermGen space的概率