-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
效率。
这里是一些信息:
- 支持x86和amd64平台上的大页面堆
- Java支持大内存页面
- 设置永久代的大小
如果您使用的是CMS
GC
还可以指定-XX:+CMSClassUnloadingEnabled
以启用class级卸载选项。 这可能有助于降低Java.lang.OutOfMemoryError: PermGen space
的概率