我们遇到了 Java.lang.OutOfMemoryError:PermGen space 错误并查看了除-Xms
和-Xmx
参数之外的tomcat JVM参数指定-XX:MaxPermSize=128m
。经过一些分析后,我可以看到PermGen空间偶尔发生垃圾收集,使其无法完全运行。
我的问题是:除了增加-XX:MaxPermSize
之外,如果我同时指定-XX:PermSize
会有什么不同?我知道总内存会是 Xmx + maxPermSize ,但是当指定-XX:PermSize
时,-XX:MaxPermSize
应该不还有其他原因吗?
如果您有处理这些JVM参数的实际经验,请分享。
PS。 JVM是HotSpot 64位服务器VM build 16.2-b04
答案 0 :(得分:43)
-XX:PermSize
指定在JVM启动期间分配的初始大小。如有必要,JVM将分配最多-XX:MaxPermSize
。
答案 1 :(得分:25)
通过使用-XX:PermSize
和-Xms
参数,您可以调整应用程序启动的性能(例如)。我最近没有看过它,但是几年前我的默认值-Xms
大概是32MB(我认为),如果你的应用程序需要的不仅仅是它会触发多个循环的填充内存 - 完全垃圾收集 - 增加内存等,直到它加载了所需的一切。此循环可能对启动性能有害,因此立即分配所需的数量可以改善启动。
类似的周期适用于永久世代。因此,调整这些参数可以改善启动(等等)。
警告 JVM在分配内存,划分eden空间和老一代等方面有很多优化和智能,所以不要做-Xms
等于-Xmx
或-XX:PermSize
等于-XX:MaxPermSize
因为它会删除JVM可以应用于其分配策略的一些优化,因此会降低应用程序性能而不是改进它。
一如既往:进行非平凡的测量,以证明您的更改实际上总体上提高了性能(例如,改善启动时间可能在使用应用程序时对性能造成灾难性后果)
答案 2 :(得分:7)
如果您正在进行一些性能调整,通常建议将-XX:PermSize
和-XX:MaxPermSize
设置为相同的值,以提高JVM
效率。
以下是一些信息:
您还可以指定-XX:+CMSClassUnloadingEnabled
以启用类卸载
如果您使用的是CMS
GC
选项。它可能有助于降低Java.lang.OutOfMemoryError: PermGen space