“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带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!