“JVM 为什么应用元空间替换了永恒代?”
这是一个工作6年的同学去字节第一面遇到的问题,很遗憾,他没有答复进去
大家好,我是Mic,一个工作了14年的Java程序员。
对于这个问题,咱们怎么答复?面试官到底关注什么呢?
面试解析
咱们都晓得Java8以及当前的版本中,JVM运行时数据区的构造都在缓缓调整和优化。
但实际上这些变动,对于业务开发的小伙伴来说,没有任何影响。
因而我能够说,99%的人都答复不出这个问题。
然而互联网大厂的面试就是筛选那1%的优秀人才,因而通过这道题,
- 既能够考查求职者对JVM原理的了解水平
- 又可能考查求职者基本功的扎实水平
- 还能实现高级人才的筛选
在Java7外面,JVM运行时数据区是这样的。
在Hotspot虚拟机中,办法区的实现是在永恒代外面,它外面次要存储运行时常量池、Klass类元信息等。
永恒代属于JVM运行时内存中的一块存储空间,咱们能够通过-XX:PermSize来设置永恒代的大小。
当内存不够的时候,会触发垃圾回收。
在JDK1.8外面,JVM运行时数据区是这样的。
在Hotspot虚拟机中,勾销了永恒代,由元空间来实现办法区的数据存储。
元空间不属于JVM内存,而是间接应用本地内存,因而不须要思考GC问题。
默认状况下元空间是能够无限度的应用本地内存的,然而咱们也能够应用JVM参数来限度内存应用大小。
为什么要应用元空间来替换永恒代,背地必然有它的情理,然而如果求职者可能答复进去。
必然对于JVM底层原理是有肯定理解的。
咱们来看看高手的答复。
高手:
有三个方面的起因:
在1.7版本外面,永恒代内存是有下限的,尽管咱们能够通过参数来设置,然而JVM加载的class总数、大小是很难确定的。
所以很容易呈现OOM问题。
然而元空间是存储在本地内存外面,内存下限比拟大,能够很好的防止这个问题。
永恒代的对象是通过FullGC进行垃圾收集,也就是和老年代同时实现垃圾收集。
替换成元空间当前,简化了Full GC。能够在不进行暂停的状况下并发地开释类数据,同时也晋升了GC的性能
- Oracle要合并Hotspot和JRockit的代码,而JRockit没有永恒代。
以上就是我对这个问题的了解。
总结
好了,明天的分享就到这里完结了。
如果喜爱我的作品,记得点赞、珍藏、关注!!!
须要金九银十Java面试题材料扫下方
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自Mic带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!