八股文骚套路之JVM(重构完善版)
近几年 Java 后端面试中,对 JVM 的考察越来越严格,这也给还没工作经验的应届生带来很大的难度。本期我们就给 JVM 知识部分画一画重点,给大家讲讲如何应付面试官对 JVM 的考察。
1救急准备
下面这些问题都是面试互联网大厂后端岗位时的常问问题,我希望你都能熟练的答出来呀!暂时没记牢也不用太担心,我建议你在投简历和约面时,把最想去的公司的面试稍微往后推一推,先面几家自己拿不到 offer 也不会难过的公司。上面这些八股文就是通过我 平时+面试 记熟的,去年 7 月 初第一次我面一家中小厂,这些都磕磕绊绊的答不出来,但是到后期 8 月底 9 月初完全能轻松应对各大厂面试官了。
另外,我通过打星与加粗的方式对下面面试题的重要性进行评级!难度是针对互联网大厂的。
⭐ :面试中不常问到,如果面试官问到尽量能答出来,答不出来也没关系。 ⭐⭐ :面试中不常问到,但是如果面试官问到的话,答不出来对你的印象会减分。 ⭐⭐⭐:面试中会问到,答不出来面试有点悬。面试官会惊讶为什么你这也不会。 ⭐⭐⭐⭐:面试高频考点。 ⭐⭐⭐⭐⭐:面试超高频考点。四星考点和五星考点是参加十场面试,至少能有五场面试问到这些的。大家在准备面试过程中尽量把这些知识点的回答条理梳理清楚,面试官一问就开背。
JVM 基础常见面试题汇总 :
运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?【⭐⭐⭐⭐⭐】 说一下方法区和永久代的关系。【⭐⭐⭐】 讲一下 Java 创建一个对象的过程。【⭐⭐⭐⭐】 对象的访问定位的两种方式(句柄和直接指针两种方式)。【⭐⭐⭐⭐⭐】 你了解分代理论吗?讲一下 Minor GC、还有 Full GC。【⭐⭐⭐⭐⭐】 Java 用什么方法确定哪些对象该被清理?讲一下可达性分析算法的流程。【⭐⭐⭐⭐】 JDK 中有几种引用类型?分别的特点是什么?【⭐⭐】 如何回收方法区?【⭐⭐⭐】 标记清楚、标记复制、标记整理分别是怎样清理垃圾的?各有什么优缺点?【⭐⭐⭐⭐⭐】 JVM 中的安全点和安全区各代表什么?写屏障你了解吗?【⭐⭐⭐⭐】 并发标记要解决什么问题?并发标记带来了什么问题?如何解决并发扫描时对象消失问题?【⭐⭐⭐⭐】相关阅读:面试官:你说你熟悉 jvm?那你讲一下并发的可达性分析 。 对于 JVM 的垃圾收集器你有什么了解的?【⭐⭐⭐⭐】有时候面试官会问出这种十分开放性的问题,你需要脑子里过一下你对这个大问题下的哪些知识熟悉哪些不熟悉,不熟悉的点一下就过,熟悉的展开讲。在准备校招时,我的一个是阿里 P7 的学姐,给我做过一次模拟面试,问出这个问题时让我有点懵,那么多东西我不知道从哪开始回答呀,就答得很凌乱。模拟面试完我问她这种问题应该从哪开始回答?她说她因为不知道我的掌握情况,所以就先问一个大问题,根据我的回答再追问,以后遇到这种问题主要从自己熟悉得方面切入就可以了。后来的面试还真遇到过好几次这种情况,我就答,垃圾收集器的种类有以下几种 Serial,ParNew...现在用的多的还是 CMS 和 G1,CMS 的垃圾收集流程是 xxx,G1 的垃圾收集流程是 xxx,他们特点是...就这样把话题引到 CMS 和 G1 了,只 CMS 和 G1 这部分和面试官讨论十几分钟完全没问题。 新生代垃圾收集器有哪些?老年代垃圾收集器有哪些?哪些是单线程垃圾收集器,哪些是多线程垃圾收集器?各有什么特点?各基于哪一种垃圾收集算法?【⭐⭐⭐⭐】 讲一下 CMS 垃圾收集器的四个步骤。CMS 有什么缺点?【⭐⭐⭐⭐】 G1 垃圾收集器的步骤。有什么缺点?【⭐⭐⭐⭐】 讲一下内存分配策略?【⭐⭐⭐⭐】 虚拟机基础故障处理工具有哪些?【⭐⭐⭐】 什么是字节码?类文件结构的组成了解吗?【⭐⭐⭐⭐】 类的生命周期?类加载的过程了解么?加载这一步主要做了什么事情?初始化阶段中哪几种情况必须对类初始化?【⭐⭐⭐⭐⭐】 讲一下双亲委派模型。【⭐⭐⭐⭐⭐】
由于篇幅问题,我并没有写上面这些问题的答案。你可以自行查阅,你也可以参考 JavaGuide 这个开源项目,涵盖了大部分 Java 程序员所需要掌握的核心知识。背面试八股文,这是一个必看的开源项目(学 Java 基础以及实战也推荐看这个项目)。
Github 地址:https://github.com/Snailclimb/JavaGuide Gitee 地址:https://gitee.com/SnailClimb/JavaGuide(Github 无法访问或者访问速度比较慢的小伙伴可以看码云上的对应内容) 在线阅读地址: https://javaguide.cn/
2系统学习
如果想要看书学习 JVM 和准备 JVM 面试的话,我建推荐两本书:一本是准备后端面试时人手一本的《深入理解 Java 虚拟机》,另一本是《实战 Java 虚拟机》。
《深入理解 Java 虚拟机》 这本书的推荐理由不用多说,面试官的 JVM 知识也是从这本书上学的。推荐实战 Java 虚拟机这本书的理由呢,是因为深入理解 Java 虚拟机这本书初学者看起来有点困难。如果你一点 JVM 虚拟机基础都没有,那么我建议你先快速过一遍实战 Java 虚拟机,然后再去啃深入理解 Java 虚拟机这本书。我的理念一直是先易后难,先做到上手再做到深挖。深入理解 Java 虚拟机这本书很厚,但是通过我的划重点,能把书变薄。大家先把我划重点的部分学会,就完全够应付面试了,剩下的部分有时间再看就好了。
这里我们以 《深入理解 Java 虚拟机》 这本书为例来介绍如何准备 JVM 面试八股文。
第 2 章 Java 内存区域与内存溢出异常
第 2 章属于第二部分的一个总概括,也是 JVM 八股文面试中的一大考点。首先,运行时数据区
是面试官特别爱问的一个问题。下面这张图大家一定要记牢。
面试官在考察 JVM 部分时,起始问题一般就是运行时数据区中包含哪些区域?哪些区域时线程共享?哪些区域线程隔离?然后以此再问你各个部分的细节。这几个区域中,堆和方法区又是考察的重点。另外虚拟机在 Java 堆中 对象的创建
、内存布局
、对象访问
定位这几个过程也是面试八股文的一大考点。如果有时间的话把 2.4 节 OutOfMemoryError 异常的实例了解一下也是挺好的。
第 3 章 垃圾收集器与内存分配策略
垃圾收集器是面试中重点的重点。首先 引用计数法
和 可达性分析算法
必须充分理解,然后强引用
、软引用
、 弱引用
、虚引用
四种类型必须理解并且记牢,面试官特别爱问四种引用的区别。垃圾收集算法中的分代收集理论要充分理解并且记熟,标记-清楚算法
、标记复制算法
、标记整理算法
要充分理解并且记熟,并比较各自的优缺点。根节点枚举
、安全点
、安全区域
、记忆集与卡表
、写屏障
、并发的可达性分析
要充分理解并能大致复述出来。经典垃圾收集器 CMS
和 G1
相关知识点要充分理解并且记熟(这是超高频考点),Serial
、ParNew
等了解就好,新生代的垃圾收集器暂时就别看了,你不说面试官不会问的。3.8 节的内存分配与回收策略的实战要好好看下,对象优先在 Eden
分配、大对象直接进入老年代
、长期存活的对象进入老年代
、动态对象年龄判定
、空间分配担保
这些技术做了什么要记清楚。这些技术使用的常见参数有哪些?
第 4 章 虚拟机性能监控、故障处理工具
这一章有时间看下,把几个常用的工具记一下,没时间就别看了。当时有个面试官问我虚拟机怎么做性能监控,我说我知道有工具可以监控虚拟机性能,但名字我记不清了,面试官说你知道有工具就行。
第 5 章 调优案例分析与实战
在这一章可以学一两个实例套到自己项目中给面试官讲,但是如果你感觉自己给面试官讲不清楚,那么千万别勉强。你别说你有 JVM 调优经验,面试官一般也不会问你。
第 6 章 类文件结构
大致扫读一遍就可以了,了解就行,面试官基本不问。
第七章 虚拟机类加载机制
类的生命周期
一定要记牢,就是下面这张图。
上述环节的顺序要记清楚,每个环节做了什么也要记清楚。比如 加载
阶段做了三件事:
(1)通过类的全限定名获取定义此类的二进制字节流。
(2)将字节流所代表的静态存储结构转化为方法区的运行时数据结构。
(3)在内存中生成一个代表这个类的 Class 对象作为方法区这个类的各种数据访问入口。其它几个环节同样,不需要记清楚细节,但是做了什么要记清楚。
类加载器中的 双亲委派模型
是八股文考试中重点的重点,被问到的频率特别高,一定要充分理解,并且记熟。
说到类加载,Java创建对象
的过程也一定要记熟呀,类加载检查 -> 分配内存 -> 初始化零值 -> 设置对象头 ->执行 init 方法,这个顺序一定要记牢,细节也要记清。
第八章 虚拟机字节码执行引擎
这一章把 栈帧的结构
弄清楚就差不多了,其它的就扫一眼就好了。
第九章 类加载及执行子系统的案例与实战
了解一下就可以了,不了解也没事。
第十二章 Java 内存模型与线程
这一章也是八股文面试考察中的重点、Java内存模型的定义
、内存间交互操作
要记清楚。volatile
这个关键字是面试考察的重点,他的作用要彻彻底底的掌握,面试中经常问。Java 内存模型的三大特征 原子性、可见性和有序性
也一定要理解。Java 线程的状态转换
也是一个常考问题。协程了解一下就好了。
第十三章 线程安全与锁优化
这部分绝对是面试中考察的重点中的重点。首先你需要理解并记牢线程安全的几种实现方法,比如互斥同步
、非阻塞同步
等。互斥同步中有两个重要的同步手段一定要重视,一个是 synchronized
,另一个是 ReentrantLock
。非阻塞同步中一个重要手段 CAS
一定要充分理解。
锁优化也是考察的重点,适应性自旋
、锁消除
、锁碰撞
、轻量级锁
、偏向锁
这些技术一定要充分理解和记熟。
好了,如果只是为了通过 JVM 的八股文面试的话,把上面我划重点的内容掌握应付校招足够了。这样看,深入理解 Java 虚拟机这本书是不是变薄了很多了?但是如果有时间的话,我还是建议你能够把整本书都好好看下呀。嗯...我知道你们应该学累了。