大厂面试题-JVM为什么使用元空间替换了永久代?

目录

面试解析

问题答案


面试解

我们都知道Java8以及以后的版本中,JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化,对于业务开发的小伙伴来说,没有任何影响。

因此我可以说,99%的人都回答不出这个问题。

但是互联网大厂的面试就是筛选那1%的优秀人才,因此通过这道题:

1、既可以考察求职者对JVM原理的理解程度

2、又能够考察求职者基本功的扎实程度

3、还能实现高级人才的筛选

在Java7里面,JVM运行时数据区是这样的(如图)。

在Hotspot虚拟机中,方法区的实现是在永久代里面,它里面主要存储运行时常量池、Klass类元信息等。

永久代属于JVM运行时内存中的一块存储空间,我们可以通过-XX:PermSize来设置永久代的大小。

当内存不够的时候,会触发垃圾回收。

在JDK1.8里面,JVM运行时数据区是这样的(如图)

在Hotspot虚拟机中,取消了永久代,由元空间来实现方法区的数据存储。

元空间不属于JVM内存,而是直接使用本地内存,因此不需要考虑GC问题。

默认情况下元空间是可以无限制的使用本地内存的,但是我们也可以使用JVM参数来限制内存使用大小。

为什么要使用元空间来替换永久代,背后必然有它的道理,但是如果求职者能够回答出来。

必然对于JVM底层原理是有一定了解的。

题答案

有三个方面的原因:

1、在1.7版本里面,永久代内存是有上限的,虽然我们可以通过参数来设置,但是JVM加载的class总数、大小是很难确定的。所以很容易出现OOM问题。

但是元空间是存储在本地内存里面,内存上限比较大,可以很好的避免这个问题。

2、永久代的对象是通过FullGC进行垃圾收集,也就是和老年代同时实现垃圾收集。替换成元空间以后,简化了Full GC。可以在不进行暂停的情况下并发地释放类数据,同时也提升了GC的性能。

3、Oracle要合并Hotspot和JRockit的代码,而JRockit没有永久代。

相关推荐
weedsfly34 分钟前
单例模式在前端中的正确打开方式
前端·javascript·面试
帅次1 小时前
Android 高级工程师面试:网络与数据层 近1年高频追问 18 题
android·网络·okhttp·面试·retrofit·gilde
脚后跟法2 小时前
.NET热门ORM真实的性能测试总结
jvm·php·.net
tkevinjd12 小时前
力扣437路径总和III
算法·leetcode·面试·职场和发展
奔跑的蜗牛ing15 小时前
CentOS Nginx 安装与静态文件服务器配置指南
前端·面试·架构
KaifuZeng18 小时前
通信与接口协议面试五、RS422
嵌入式硬件·面试·通信与接口
SamDeepThinking20 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
wear工程师20 小时前
setState 到底是不是异步的?这题从 React 16 问到 18,标准答案早就变了
react.js·面试
SamDeepThinking1 天前
为什么很多人学了Java,还是没真正理解类和对象?
java·后端·面试
阿新聊ai1 天前
Claude Code 为什么总不懂你的项目?缺一张「项目地图」
前端·后端·面试