《为什么JVM要用元空间代替永久代?》这是一位工作6年的同学在字节跳动第一页遇到的问题。不幸的是,他没有回答。大家好,我是Mic,工作了14年的Java程序员。我们如何回答这个问题?面试官究竟在寻找什么?面试分析众所周知,在Java8及之后的版本中,JVM运行时数据区的结构在慢慢调整和优化。但实际上,这些变化对业务发展的小伙伴们并没有什么影响。所以我可以说这个问题99%的人都答不上来。但是,各大互联网公司的面试,都是为了筛选那1%的优秀人才。所以,通过这道题,不仅可以考察求职者对JVM原理的理解,还可以考察求职者基本功的扎实程度。还可以实现高级人才的筛选。在内部,JVM运行时数据区看起来像这样。在Hotspot虚拟机中,方法区的实现是在永久代中,主要存放运行时常量池、Klass类元信息等,永久代属于JVM运行时内存中的一块存储空间。我们可以通过-XX:PermSize来设置永久代的大小。当内存不足时,就会触发垃圾回收。在JDK1.8中,JVM运行时数据区是这样的。Hotspot虚拟机中取消了永久代,方法区的数据存储由元空间实现。Metaspace不属于JVM内存,直接使用本地内存,所以不需要考虑GC问题。默认情况下,元空间可以使用无限的本地内存,但我们也可以使用JVM参数来限制内存使用的大小。为什么要用元空间代替永久代,背后一定有原因,但如果求职者能够回答。必须对JVM的底层原理有一定的了解。一起来看看大师的解答吧。专家:有3个原因:1.7版本,永久代内存有上限。虽然我们可以通过参数来设置,但是JVM加载类的总数和大小是很难确定的。所以很容易出现OOM问题。但是metaspace存储在本地内存中,内存的上限比较大,可以很好的避免这个问题。永久代的对象通过FullGC进行垃圾回收,即与老年代同时实现垃圾回收。换成metaspace后,FullGC就简化了。类数据可以并发释放,不会停顿,也提高了GC的性能。Oracle需要合并Hotspot和JRockit的代码,而JRockit没有永久代。以上是我对这个问题的理解。今天的分享到此结束。喜欢我的作品记得点赞收藏关注哦!!!金九银十Java面试题扫描下方版权声明:除非另有说明,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
