53

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

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

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

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

4

3 回答 3

47

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

于 2011-12-02T12:44:08.663 回答
26

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

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

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

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

于 2011-12-02T14:59:21.063 回答
8

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

以下是一些信息:

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

如果您-XX:+CMSClassUnloadingEnabled正在使用CMS GC. 可能有助于降低发生概率Java.lang.OutOfMemoryError: PermGen space

于 2011-12-02T16:15:40.160 回答