Java|携程面试官问我怎么划分 Java 虚拟机内存区域,相见恨晚!( 三 )


换句话说 , 方法区和永久代的关系就像是 Java 中接口和类的关系 , 类实现了接口 。
在方法区中 , 还有一块非常重要的部分 , 也就是运行时常量池 。 在讲 class 文件的时候 , 提到了每个 class 文件都会有个常量池 , 用来存放字符串常量、类和接口的名字、字段名、常量等等 。 运行时常量池和 class 文件的常量池是一一对应的 , 它就是通过 class 文件中的常量池来构建的 。
JDK 7 之前 , 运行时常量池中包含着字符串常量池 , 都在方法区 。
JDK 7 的时候 , 字符串常量池从方法区中拿出来放到了堆中 , 运行时常量池中的其他东西还在方法区中 。
JDK 8 的时候 , HotSpot 移除了永久代 , 也就是说方法区不存在了 , 取而代之的是元空间 。 也就意味着字符串常量池在堆中 , 运行时常量池跑到了元空间 。
再来说说为什么要将永久代 (PermGen) 或者说方法区替换为元空间 (MetaSpace)。
第一 , 永久代放在 Java 虚拟机中 , 就会受到 Java 虚拟机内存大小的限制 , 而元空间使用的是本地内存 , 也就脱离了 Java 虚拟机内存的限制 。
【Java|携程面试官问我怎么划分 Java 虚拟机内存区域,相见恨晚!】第二 , JDK 8 的时候 , 在 HotSpot 中融合了 JRockit 虚拟机 , 而 JRockit 中并没有永久代的概念 , 因此新的 HotSpot 就没有必要再开辟一块空间来作为永久代了 。