换句话说 , 方法区和永久代的关系就像是 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 就没有必要再开辟一块空间来作为永久代了 。
- Java|成功人士都喜欢什么样的手机?这几款外表商务,功能还非常强大
- Java|行业唯一!企查查入选2021年中国互联网综合实力前百强企业
- 星巴克|2021 年游戏开发中的 10 大编程语言:C++、Java、C#......
- 小米科技|Java培训:7个简单的Java性能调优技巧
- 自动化|腾讯近三年 78 道软件测试面试题(包含答案)
- Java|京东商场选择客服外包能解决哪些问题?
- Java|2022年如何学习自动化测试?
- Java|在Java开发领域开始职业生涯
- javascript|百度、京东、B站、爱奇艺第三季度巨亏,字节跳动增长乏力
- 程序员|Java培训:学习java 的十大原因