永久代(Permanent Generation)是HotSpot JVM早期的垃圾收集器结构。它的主要作用是存储类加载器及类信息(如类的元数据)等数据。
永久代的作用是:
- 存储类加载器及定义在方法区的类型信息。
- 永久代空间不足时会引起Full GC,这会严重影响性能。
- 永久代Memery Reclamation(CMS)作为PermGen的收集器在早期版本中不稳定,经常出现OOME。
- 永久代被元空间取代,用于存储类加载器及类信息。元空间位于本地堆内存,不在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异常。
所以,理解永久代可以让我们更好的判断内存分配和回收。