PermGen是Permanent Generation的缩写,它是HotSpot对于JVM方法区的一种实现,也常被称为永久代。永久代是一片连续的堆空间,在JVM启动之前通过在命令行设置参数-XX:MaxPermSize来设定永久代最大可分配的内存空间,32位JVM的默认最大内存大小为64 MB,64位版本为82 MB。永久代的垃圾收集是和老年代(old generation)在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。
一个常见的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会抛出OOM异常。特别地是,在Java 7之前,字符串常量池实际上保留在PermGen里,这种情况导致的java.lang.OutOfMemoryError: PermGen space,常会让人产生误解。
移除永久代的工作从JDK1.7就开始了。JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。