阿里二面JVM相关面试题
Posted 波波烤鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里二面JVM相关面试题相关的知识,希望对你有一定的参考价值。
JVM是面试中一直绕不过去的坎,如此我们就征服它,本文给大家整理了阿里二面出现的JVM相关的面试题,希望对你有所帮助
一、问题
1.JVM内存模型,GC机制和原理;
2.GC分哪两种,Minor GC 和Full GC有什么区别?什么时候会触发Full GC?分别采用什么算法?
3.JVM里的有几种classloader,为什么会有多种?
4.什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;
5.什么情况下我们需要破坏双亲委派模型;
6.常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
7.JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class文件结构是如何解析的;
二,解答
1.Q1
问题:JVM内存模型,GC机制和原理。
首先看内存模型:
内存模型
- Jdk1.6及之前:有永久代, 常量池在方法区
- Jdk1.7:有永久代,但已经逐步“去永久代”,常量池在堆
- Jdk1.8及之后: 无永久代,常量池在元空间
2.Q2
问题:GC分哪两种,Minor GC 和Full GC有什么区别?什么时候会触发Full GC?分别采用什么算法?
首先看定义
- 对象从新生代区域消失的过程,我们称之为 “minor GC”
- 对象从老年代区域消失的过程,我们称之为 “major GC”
Minor GC
清理整个YouGen的过程,eden的清理,S0\\S1的清理都会由于MinorGC Allocation Failure(YoungGen区内存不足),而触发minorGC
Major GC
OldGen区内存不足,触发Major GC
Full GC
Full GC 是清理整个堆空间—包括年轻代和永久代
Full GC 触发的场景
-
System.gc
-
promotion failed (年代晋升失败,比如eden区的存活对象晋升到S区放不下,又尝试直接晋 升到Old区又放不下,那么Promotion Failed,会触发FullGC)
-
CMS的Concurrent-Mode-Failure 由于CMS回收过程中主要分为四步:
1.CMS initial mark
2.CMS Concurrent mark
3.CMS remark
4.CMS Concurrent sweep。在2中gc线程与用户线程同时执行,那么用户线程依旧可 能同时产生垃圾, 如果这个垃圾较多无法放入预留的空间就会产生CMS-Mode-Failure, 切换 为SerialOld单线程做mark-sweep-compact。
- 新生代晋升的平均大小大于老年代的剩余空间 (为了避免新生代晋升到老年代失败) 当使用G1,CMS 时,FullGC发生的时候 是 Serial+SerialOld。 当使用ParalOld时,FullGC发生的时候是 ParallNew +ParallOld.
3.Q3
问题:JVM里的有几种classloader,为什么会有多种?
- 启动类加载器:负责加载JRE的核心类库,如jre目标下的rt.jar,charsets.jar等
- 扩展类加载器:负责加载JRE扩展目录ext中JAR类包
- 系统类加载器:负责加载ClassPath路径下的类包
- 用户自定义加载器:负责加载用户自定义路径下的类包
为什么会有多种?
- 分工,各自负责各自的区块
- 为了实现委托模型
4.Q4
问题:什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的 加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载 器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都不愿意干活,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完 成,这不就是传说中的双亲委派模式。
双亲委派的好处:
沙箱安全机制:自己写的String.class类不会被加载,这样便可以防止核心API库被随意篡改 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次 。
5.Q5
问题:什么情况下我们需要破坏双亲委派模型?
双亲委托有个弊端:
- 不能向下委派,不能不委派
怎么打破双亲委派机制:(也就是能向下委派和不委派)
- 自定义类加载器(不委派)
- spi机制(向下委派)
打破双亲委派的两种方式:
- 通过spi机制,使用ServiceLoader.load去加载
- 通过自定义类加载器,继承classloader,重写loadclass方法
6.Q6
问题:常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
调优工具
console,jProfile,VisualVM ,Dump线程详细信息:查看线程内部运行情况
死锁检查
查看堆内类、对象信息查看:数量、类型等
线程监控
线程信息监控:系统线程数量。
线程状态监控:各个线程都处在什么样的状态下
热点分析
CPU热点:检查系统哪些方法占用的大量CPU时间
内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
7.Q7
问题:JVM虚拟机内存划分、类加载器、垃圾收集算法、垃圾收集器、class 文件结构是如何解析的
JVM虚拟机内存划分(上面)
类加载器(上面)
垃圾收集算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法
垃圾收集器: Serial收集器、ParNew收集器、Parallel Scavenge收集器、Serial Old收集器、 Parallel Old收集器、CMS收集器、G1收集器、Z垃圾收集器
文件结构:Class文件结构
以上是关于阿里二面JVM相关面试题的主要内容,如果未能解决你的问题,请参考以下文章
史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)
史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)
「Java岗」阿里150道面试题:JVM+并发+SpringBoot+Netty+Redis等