PermGen space Java

2025 年 5 月 2 日 | 阅读 2 分钟

PermGen 代表 永久代 (Permanent Generation)。它是一种特殊的堆空间。它独立于主内存 (堆)。JVM 使用 PermGen 来跟踪已加载的类元数据。所有静态内容都由 JVM 存储在这个内存区域。静态内容可以是静态方法、静态对象的引用和基本变量。PermGen 还包含关于字节码、名称和 JIT 的信息。在发布 Java 7 之前,字符串常量池也存在于此空间中,在发布 Java 7 后则独立于此空间。

JVM 内存分为两部分,如下所示:

  1. PermGen 空间 (永久代)
  2. 堆空间
    1. Eden Space (年轻代)
    2. Survivor Space (年轻代)
    3. Old Generation (老年代)
PermGen space Java

PermGen 空间包含 JVM 持有的 Java 类的内部表示。永久代是垃圾数据,其收集方式与其他堆部分相同。它是一个特殊的内存区域,包含程序类的元数据以及程序的静态对象。它还包含在手动使用结束后被销毁的类加载器。这里的垃圾收集器效率不高,因此经常导致“Out of Memory: PermGen space”错误。

PermGen 空间的主要缺点是它的最大尺寸是固定的。对于 32 位和 64 位 JVM 版本,最大内存大小分别为 64 MB 和 82 MB。我们可以使用以下选项修改其默认大小:

  • XX: PermSize
    XX: PermSize 是 PermGen 空间的最小或初始大小。
  • XX: MaxPermSize
    XX: MaxPermSize 是最大大小。

让我们通过一个例子来生成 PermGen 空间错误并进行分析。

TestMemory.java

现在,将上述代码作为一个配置来运行。我们将在参数中添加以下命令:

参数值会将详细的垃圾收集输出重定向到一个文件 gc.log。

PermGen space Java

点击“运行”后,我们将得到以下输出:

输出

PermGen space Java