什么是永久代?它的作用是什么?代码举例讲解

永久代(Permanent Generation)是HotSpot JVM早期的垃圾收集器结构。它的主要作用是存储类加载器及类信息(如类的元数据)等数据。

永久代的作用是:

  1. 存储类加载器及定义在方法区的类型信息。
  2. 永久代空间不足时会引起Full GC,这会严重影响性能。
  3. 永久代Memery Reclamation(CMS)作为PermGen的收集器在早期版本中不稳定,经常出现OOME。
  4. 永久代被元空间取代,用于存储类加载器及类信息。元空间位于本地堆内存,不在Java堆内存管理下。

我们可以通过-XX:PermSize和-XX:MaxPermSize来设置永久代的初始大小和最大大小。

来看一个简单示例:

public class PermGenDemo {
    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {   // 构建10w个class
            new PermGenClass();
        }
    }
}

class PermGenClass {}

如果不配置参数,运行该示例会抛出OOM,异常信息如下:

java.lang.OutOfMemoryError: PermGen space

这是因为在构建很多class时,永久代空间不足所致。
我们可以配置参数:

-XX:PermSize=10M -XX:MaxPermSize=20M

然后再运行,这时程序能够正常执行,没有抛出OOM异常。
所以,理解永久代可以让我们更好的判断内存分配和回收。