当前位置:首页 > 问答 > 正文

面试那些JVM知识点又来了,准备好被问到头大了吗?

(引用来源:各大互联网公司技术面试常见考点汇总)

面试官笑眯眯地看着你,上来可能先抛出一个看似简单的问题热身:“来,说说看,JVM的内存区域都划分成哪几块?分别都是干嘛用的?” 你要是只答出个堆、栈,那可能就要被追问到头皮发麻了。 基本上是必考的起手式,你得清楚地知道,JVM内存大概分这么几个主要部分:首先是线程私有的,比如程序计数器,它就像个指挥棒,告诉当前线程执行到哪条指令了;Java虚拟机栈,里面是一个个栈帧,每个方法执行都会创建一个栈帧,用来存局部变量、操作数栈啥的;本地方法栈,跟虚拟机栈类似,不过是服务Native方法的,然后是线程共享的:堆,这是最大的一块,几乎所有对象实例都在这儿分配内存,也是垃圾收集器重点照顾的区域;方法区,用来存已被虚拟机加载的类信息、常量、静态变量这些,JDK 8之后,方法区的实现变成了元空间,用的是本地内存,这就跟永久代说再见了,你要是能顺带提一嘴为什么用元空间替代永久代,比如为了避免永久代的内存溢出问题,调优更简单之类的,那绝对是加分项。

(引用来源:深入理解Java虚拟机 第三版)

热身完毕,面试官肯定会把话题引向重头戏——垃圾回收,他可能会问:“对象怎么就被判定为‘垃圾’了?JVM怎么知道该回收谁?” 这里你得提到两种常见的判定算法:引用计数法和可达性分析算法,引用计数法简单但解决不了循环引用的问题,所以主流JVM用的都是可达性分析,就是从一系列叫“GC Roots”的根对象开始,看哪些对象是可达的,不可达的就标记为可回收,你得能说出哪些对象可以作为GC Roots,比如虚拟机栈里引用的对象、方法区里静态属性引用的对象、方法区里常量引用的对象,还有本地方法栈里引用的对象等等。

光知道判定还不够,面试官接着肯定会问:“那具体的垃圾收集算法有哪些?各有什么优缺点?” 这就得聊到标记-清除、复制、标记-整理这些基础算法了,标记-清除简单但有内存碎片;复制算法没碎片但浪费一半空间,适合新生代;标记-整理解决了碎片问题,但速度慢点,适合老年代,现在主流的垃圾收集器基本都是这些算法的组合应用。

面试那些JVM知识点又来了,准备好被问到头大了吗?

(引用来源:Oracle官方文档、HotSpot VM源码分析)

说到垃圾收集器,这才是最容易让人头大的部分,面试官可能会让你对比一下Serial、Parallel Scavenge、ParNew、CMS、G1、ZGC这些收集器,你得知道它们分别是干嘛的,适用于什么场景,比如Serial是单线程的,适合客户端模式;Parallel Scavenge和ParNew都是多线程收集新生代的,但关注点不同,一个注重吞吐量,一个注重低延迟;CMS是并发收集老年代的,目标是减少停顿时间,但它有碎片问题;G1是面向服务端的,把堆分成很多Region,可以预测停顿时间;ZGC和Shenandoah就更厉害了,追求极致的低停顿,几乎不分代了,你要是能结合JDK版本说说演变,比如CMS在JDK 14被移除了,G1成了默认收集器,ZGC和Shenandoah是未来的趋势,那说明你确实跟上了技术发展。

(引用来源:Java虚拟机规范)

面试那些JVM知识点又来了,准备好被问到头大了吗?

光说不练假把式,面试官可能会给你个实际场景:“如果线上应用突然出现CPU占用率飙升,或者频繁Full GC,你可能怎么去排查?” 这就涉及到JVM调优和监控工具了,你得知道用什么工具,比如用jps看进程,jstat看GC情况,jmap可以生成堆转储快照,jstack可以看线程栈信息,用这些工具看到异常现象后,比如发现老年代满了导致Full GC,可能就要考虑是不是内存泄漏了,或者年轻代设置太小导致对象过早晋升到老年代,调优不是瞎调参数,得基于监控数据和分析。

(引用来源:常见JVM面试题集锦)

类加载机制也是高频考点,面试官可能会问:“一个类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期是怎样的?” 这就是类加载的过程:加载、验证、准备、解析、初始化、使用、卸载,其中准备阶段是给静态变量分配内存并设初始值,初始化阶段才是执行静态代码块和赋真正的值,然后肯定会问到类加载器,双亲委派模型是啥?为什么要有双亲委派?简单说就是保证Java核心库的类型安全,避免用户自定义的类覆盖核心库的类,但有时候也会打破双亲委派,比如JNDI服务、热部署等场景。

面试官可能还会问点稍微偏一点的,比如Java内存模型(JMM),这主要是解决多线程环境下可见性、原子性、有序性问题的,volatile关键字有什么用?synchronized和ReentrantLock有什么区别?这些虽然不完全是JVM的范畴,但和JVM的内存模型、线程实现紧密相关,答好了也能体现你的知识广度。

JVM的知识点又杂又深,面试官就是希望通过这些问题,看你对Java底层运行机制的理解程度,有没有实际解决问题的经验,准备的时候不能光背概念,最好能结合实际案例理解,不然真的会被问到头大。