Java 8彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace。
在HotSpot JVM中,永久代中用于存放类和方法的元数据以及常量池,在Java中对应能通过反射获取到的数据,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。
永久代是有大小限制的,因此如果加载的类太多,很有可能导致永久代内存溢出,即 java.lang.OutOfMemoryError: PermGen 。为此我们不得不对虚拟机做调优
Java 8中永久代被移出HotSpot JVM的原因主要有两个:
1、由于Permanent Generation内存经常不够用或发生内存泄露,引发java.lang.OutOfMemoryError: PermGen (在Java Web开发中非常常见)。
2、移除Permanent Generation可以促进HotSpot JVM与JRockit VM的融合,因为JRockit没有永久代。
根据上面的各种原因,永久代最终被移除,方法区移至Metaspace,字符串常量移至Java Heap。