相信许多Java开发者都见过“java.lang.OutOfMemoryError: PermGen space”问题,这通常是类加载器相关的内存泄漏以及新类加载器的创建导致的,一般出现于代码热部署时。相对于正式产品,该问题在开发机上出现的频率更高,通常“问题”是默认值太低了, 常用的解决方法是将其设置为256MB或更高。
PermGen space的全称是Permanent Generation space,是指JVM永久保存区域,这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。JVM 种类有很多(如Oralce-Sun Hotspot, Oralce JRockit, IBM J9, Taobao JVM)。Oracle-Sun Hotspot才有PermGen space,JRockit以及J9没有这个区域。
随着JAVA8时代的来临,新增一种使用本地内存来存储类元数据信息称之为元空间(Metaspace),JVM永久区被元空间(Metaspace)替换(JEP 122), 与Oracle JRockit 和IBM JVM’s很相似。JVM参数 -XX:PermSize 和 -XX:MaxPermSize被XX:MetaSpaceSize 和 -XX:MaxMetaspaceSize代替,如果使用了-XX:PermSize 和 -XX:MaxPermSize启动时会发出警告。。 这意味着不会再有java.lang.OutOfMemoryError: PermGen问题,也不再需要你进行调优及监控内存空间的使用。