文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试时候总喜欢问的 JVM 要点在哪?

2024-12-02 09:58

关注

本文转载自微信公众号「Java极客技术」,作者鸭血粉丝 Tang。转载本文请联系Java极客技术公众号。

面试的时候,很多面试官问 JVM 的时候,我们作为一个开发者,很多时候很难 Get 到面试官提问的要点,因为 JVM 确实太多了,从程序计数器开始,然后堆,然后栈,但是面试的时候却总是回答不好这个问题,很多情况就是没有系统的去看过所以回答面试题的时候,会出现语无伦次,这一块内容,那边一块内容,总是回答不好,几天阿粉就来分享给大家一个 JVM 的面试教程,对你有用的话,点赞关注和收藏一波。

你对 JVM 了解么?

首先,问这个问题的,一般都是问完了一些基础了,这时候需要你自己从头开始说 JVM 了,很多人实际上想到就是垃圾回收机制,确实,没错,但是,如果你直接就开始说是不是垃圾回收机制的时候,就已经有点答非所问了。

为什么这么说,因为 JVM 的垃圾回收机制,都是发生在 堆内存 的,但是,JVM 的划分可不是只要堆内存的,这时候回答应该怎么回答?

** JVM 的内部结构,最主要的内部结构是什么!**

JVM 分成了两个部分

线程共享区域

线程私有区域

线程共享区域包含:堆(Heap)、方法区

线程私有区域包含:程序计数器、虚拟机栈(Stack)、本地方法栈

因为 JVM ,那可是不单单只有 堆(Heap) 的存在呀,其他的存在也是不可缺少的,为什么阿粉要这么说呢?

因为有些面试官会问 JVM 的类加载机制 你了解么?

如果你只是了解了垃圾回收机制的话,那你这个问题,是不是有点麻了,有点懵了,这不就芭比Q 了么?

那么 JVM 的类加载机制 是个什么呢?

回答:

首先通过类加载器(ClassLoader)会把 .class字节码文件加载到内存中——运行时数据区(Runtime Data Area),而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

跑偏了,我们继续回答上一个问题,既然你说你了解了,你也回答了都有哪些内部结构了,是不是就该说说这些内容是干啥的了,对,没错,就是这么回答。

说完这个,没啥事别停顿,如果你停顿了,这时候面试官很有可能接着去问你栈的一些特性,你本身是想说垃圾回收机制的,总不能被带跑偏吧,所以,继续往下说。

最后我们再说堆(Heap)

堆是 JVM 中最主要的区域了,因为堆(Heap)是 Java 虚拟机所管理的内存中最大的一块。

唯一目的就是储存对象实例和数组(JDK7 已把字符串常量池和类静态变量移动到 Java 堆),几乎所有的对象实例都会存储在堆中分配。

但是呢,随着 JIT 编译器发展,逃逸分析、栈上分配、标量替换等优化技术导致并不是所有对象都会在堆上分配。

这时候,一般面试官都会开始提问了,就会让你具体的说说堆内存。

Java Heap 堆

Java 堆是垃圾收集器管理的主要区域。堆内存分为新生代 (Young) 和老年代 (Old)

什么是新生代?

主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。

什么是老年代?

老年代的对象比较稳定,所以MajorGC不会频繁执行。

那么我们在分别来介绍一下 JVM 的新生代 和 老年代,就这两个,足够你和面试官聊上十几分钟的内容了。

JVM 的新生代(垃圾回收机制)

新生代分为Eden区、ServivorFrom、ServivorTo三个区。

保留了一次MinorGc过程中的幸存者。

那么新生代会使用什么样子的垃圾回收机制呢?

我们每次new对象的时候都会先在新生代的Enden区放着也就是最开始 是这样子的

然后在Enden用完的时候里面会出现待回收的

然后就来了把存活的对象复制放到Survior1(from)中,待回收的等待给他回收掉 就是这样的

然后把Enden区清空回收掉

这样的话 第一次GC就完成了,下面再往下走

当Enden充满的时候就会再次GC

先是这个样子的

然后会把 Enden和Survoir1中的内容复制到Survior中,

然后就会把Enden和Survior进行回收

然后从Enden中过去的就相当于次数少的,而从Survior1中过去的就相当于移动了2次

这样新生代的GC就执行了2次了,

当Enden再次被使用完成的时候,就会从Survior2复制到Survior1中,

接下来是连图

经过回收之后Surior1就变了,1对象是从Enden直接复制过来的,2对象是Enden-->Survior2-->Survior1 ,3对象则是从Enden-->Surivior1-->Survior2-->Survior1 复制过来的,这样一步一步的执行下去的时候,就是新生代的GC。

这就是新生代采用的 GC ,如果你需要给面试官解释,那么你就得熟练的记住这个图,为什么这么说,因为只有你掌握了这个图,那么你绝对会把这个复制算法给面试官讲述的明明白白。

既然我们都知道了这个复制算法了,那么他到底有什么缺点呢?

但是我们也得吹一下复制算法的牛逼的地方呀。

吞吐量高所谓吞吐量就是搜索活动对象的时间比上搜索堆时间,越高说明你的有效搜索占比越高,不难看出,我们都是从根开始,搜索的全部是活动对象,并没有浪费时间去搜索垃圾对象。这个优势在堆越大的场景下越明显。

没有碎片

在将活动对象复制到To空间时,他们都是紧挨着的,然后清空From时全部清空,完全没有碎片的可能。

这也是新生代使用的垃圾回收的算法。

JVM 的老年代(垃圾回收机制)

老年代的垃圾回收机制,采用的则是和新生代不一样的方式,有些人称之为FullGC,而FullGC出现的原因则是:在新生代如果说存在的对象或者说新创建 出来的对象由于某些原因需要移动到老年代中,但是老年代中压根就没有这么大的内存空间去容纳这个对象, 那么就会引发一次FullGC,如果在执行完FullGC之后,还是没有办法给这些对象分配内存,那么凉了,该抛出异常了,异常类型就是OutOfMemoryError。

而FullGC使用的是和MinorGC不一样的算法,它使用的是标记清除算法,听名字,挺好理解的,来波图示解析一波。深入了解JVM一书中的图示是这个样子的,

图示是不是看着也挺明确,先标记,然后在删除。

在了解了这个之后,我们还得说一个概念,那就是GC Root,Root我们可以理解成一个根节点就像这个样子

上图中的a,b,c,d,就是活着的对象,如果说存在这引用,比如说b引用的a,那么a他就是属于活着的对象。当我们老年代内存区中的有效的内存空间不够的时候,那么这时候整个世界都要安静下来了(stop the world),这时候就要开始准备进行垃圾回收了。

流程图就像这个样子的 初始下的老年代中的对象状态

这时候都是没有被标记的状态,接下来内存不够,GC线程停止,开始进行标记了

按照根节点开始遍历 标记的abcdeh都是存活的对象,接下来开始标记。

接下来就是清除数据了

清楚完成之后还有就是把标记去除掉,可以下次进行标记清除的时候继续清除

其实这个阿粉的老读者肯定看过,因为很早之前阿粉就画出过这个图。

这样标记清除就执行完毕了。

这时候不吹不黑,肯定会有优缺点,不然为啥不采用其他的方法呢?毕竟 JVM 肯定是会选择最适合自己的方式来进行 GC 的。

缺点清除后的堆内存由于空间不连续,即内存碎片化,若下一次需要分配对象的内存大于碎片空间,这样会提前触发GC,当提前触发的GC回收后,空间还是不足就会出现OOM等错误。

时间问题:由于分为两个过程(标记、清除),当堆内可回收对象较多时,该算法需要进行大量的标记与清除,这里就产生一个问题,随着可回收对象的的增多,标记和清除的效率就会下降;再者由于空间不连续导致每次再次分配都要遍历空闲列表。

有点

实现简单,与保守式GC算法兼容 这阿粉真的说不上他其他的优点了,除了能够解决引用计数算法带来的不能清除循环引用的问题外,阿粉实在不知道了。

关于 JVM 的知识要点,你学会了么?

 

来源:Java极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯