八股文骚套路之JVM
大家好,这是面试八股文骚套路系列的第四篇,JVM 篇。近几年Java后端面试中,对 JVM 的考察越来越严格,这也给还没工作经验的应届生带来很大的难度。本期我们就给 JVM 知识部分画一画重点,给大家讲讲如何应付面试官对 JVM 的考察。
推荐阅读:
我首先要给大家推荐两本书,一本是准备后端面试时人手一本的深入理解 Java 虚拟机,另一本是实战 Java 虚拟机。
推荐理由:深入理解 Java虚拟机 这本书的推荐理由不用多说,面试官的 JVM 知识也是从这本书上学的。推荐实战 Java 虚拟机这本书的理由呢,是因为深入理解 Java 虚拟机这本书初学者看起来有点困难。如果你一点 JVM 虚拟机基础都没有,那么我建议你先快速过一遍实战 Java 虚拟机,然后再去啃深入理解Java虚拟机这本书。我的理念一直是先易后难,先做到上手再做到深挖。深入理解 Java 虚拟机这本书很厚,但是通过我的划重点,能把书变薄。大家先把我划重点的部分学会,就完全够应付面试了,剩下的部分有时间再看就好了。
「面试小技巧:」
这里插播一则面试小技巧。在面试过程中,面试官特别注重应聘者的归纳和总结能力。希望大家在回答面试官的问题时,都能把要回答的知识总结成 1,2,3,4 这样,然后一条条的给面试官讲述出来。比如你有一个秒杀系统,你就应该这样给面试官讲。我的秒杀系统的架构为 Nginx + Redis + RabbitMQ + MySQL。首先我在缓存数据库上采用 Cluster 形式的集群,解决了 xxx 问题。在消息中间件上采用什么方式解决了什么问题,最后在 MySQL 部分我针对 xxx 情况进行了 xxx 设计,解决了 xxx 问题。我见过许多应聘者,想起什么说什么,把自己说懵了,也把面试官搞糊了。不管是讲项目,还是背八股文,甚至是参加hr面,在听到问题的时候都应该想一下,把回答条理了再给面试官讲,这样面试官能快速的捕捉到你的重点。
深入理解Java虚拟机
第二部分 自动内存管理
「第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虚拟机这本书是不是变薄了很多了?但是如果有时间的话,我还是建议你能够把整本书都好好看下呀。嗯...我知道你们应该学累了。
下面我出一些问题,把我上面说的学完以后,你可以用来自测一下你 JVM 准备的怎么样了,可以收藏了等面试前再过一遍。答案都在深入理解Java虚拟机这本书中。
「测试开始」
1.运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?
2.讲一下 Java 创建一个对象的过程。
3.如何访问对象?
4.你了解分代理论吗?讲一下 Minor GC、还有 Full GC
5.Java 用什么方法确定哪些对象该被清理?讲一下可达性分析算法的流程。
6.JDK 中有几种引用类型?分别的特点是什么?
7.如何回收方法区?
8.标记清楚、标记复制、标记整理分别是怎样清理垃圾的?各有什么优缺点?
9.JVM 中的安全点和安全区各代表什么?写屏障你了解吗?
10.讲一下解决并发扫描时对象消失问题的两种方案。
11.对于 JVM 的垃圾收集器你有什么了解的?你讲一下。
有时候面试官会问出这种十分开放性的问题,你需要脑子里过一下你对这个大问题下的哪些知识熟悉哪些不熟悉,不熟悉的点一下就过,熟悉的展开讲。在准备校招时,我的一个是阿里 P7 的学姐,给我做过一次模拟面试,问出这个问题时让我有点懵,那么多东西我不知道从哪开始回答呀,就答得很凌乱。模拟面试完我问她这种问题应该从哪开始回答?她说她因为不知道我的掌握情况,所以就先问一个大问题,根据我的回答再追问,以后遇到这种问题主要从自己熟悉得方面切入就可以了。后来的面试还真遇到过好几次这种情况,我就答,垃圾收集器的种类有以下几种 Serial,ParNew...现在用的多的还是 CMS 和 G1,CMS 的垃圾收集流程是 xxx,G1的垃圾收集流程是 xxx,他们特点是...就这样把话题引到 CMS 和 G1了,只 CMS 和 G1 这部分和面试官讨论十几分钟完全没问题。
12.新生代垃圾收集器有哪些?老年代垃圾收集器有哪些?哪些是单线程垃圾收集器,哪些是多线程垃圾收集器?各有什么特点?各基于哪一种垃圾收集算法?
13.讲一下 CMS 垃圾收集器的四个步骤。CMS 有什么缺点?
14.G1垃圾收集器的步骤。有什么缺点?
15.讲一下内存分配策略?
16.虚拟机基础故障处理工具有哪些?
17.类的生命周期?类加载阶段完成了哪些事情。
18.讲一下双亲委派模型。
19.把你对 volatile 的了解讲一下。
20.Java 内存模型的原子性、可见性和有序性是通过哪些操作实现的?
21.线程的状态有哪些?
22.按照线程安全的强度来区分,分为哪几类?
23.线程安全的实现方法有哪些?
24.锁优化技术你了解什么?
上述问题都是面试互联网大厂后端岗位时的常问问题,我希望你都能熟练的答出来呀!暂时没记牢也不用太担心,我建议你在投简历和约面时,把最想去的公司的面试稍微往后推一推,先面几家自己拿不到 offer 也不会难过的公司。上面这些八股文就是通过我 平时+面试 记熟的,去年 7月 初第一次我面一家中小厂,这些都磕磕绊绊的答不出来,但是到后期 8月底 9月初完全能轻松应对各大厂面试官了。
大家在校招过程中遇到问题欢迎来找我聊天呀。
我是 Guide哥,一个工作2年有余,接触编程已经6年有余的程序员。大三开源 JavaGuide,目前已经 100k+ Star。未来几年,希望持续完善 JavaGuide,争取能够帮助更多学习 Java 的小伙伴!共勉!凎!点击即可了解我的个人经历。
欢迎点赞分享。咱们下期再会!