「每天一道面试题」如何理解JVM中的永久代及JDK8中的实现?

「每天一道面试题」如何理解JVM中的永久代及JDK8中的实现?

首先,Java虚拟机规范中只定义了方法区用于存储已被虚拟机加载的类信息、常量、静态变量和即时编译后的代码等数据,而方法区具体如何实现并没有明确规定,所以每个虚拟机可以根据需要自由发挥实现。

对JDK8之前的Hotspot虚拟机来说,会在虚拟机内存中划分一块区域用于存储编译后的类的字节码信息、类的静态变量等,称之为永久代,作为方法区的实现。

虽然JDK7的Hotspot虚拟机也对永久代做了弱化变更,但变更的并不完全,从JDK8开始,已经完全移除了永久代实现,但是方法区还在,原永久代中存储的类的元数据将存储在metaspace中,而类的静态变量和字符串常量将放在Java堆中,metaspace是方法区的一种实现,只不过它使用的不是虚拟机内的内存,而是本地内存。