小程序三方平台开发: 解析小程序开发的未来趋势和机遇
768
2022-11-22
阿里二面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.gcpromotion 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文件结构
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~