阿里二面JVM相关面试题

举报
波波烤鸭 发表于 2022/03/29 23:21:43 2022/03/29
【摘要】   JVM是面试中一直绕不过去的坎,如此我们就征服它,本文给大家整理了阿里二面出现的JVM相关的面试题,希望对你有所帮助 一、问题 1.JVM内存模型,GC机制和原理; 2.GC分哪两种,Mino...

请添加图片描述

  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 触发的场景

  1. System.gc

  2. promotion failed (年代晋升失败,比如eden区的存活对象晋升到S区放不下,又尝试直接晋 升到Old区又放不下,那么Promotion Failed,会触发FullGC)

  3. 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。

  1. 新生代晋升的平均大小大于老年代的剩余空间 (为了避免新生代晋升到老年代失败) 当使用G1,CMS 时,FullGC发生的时候 是 Serial+SerialOld。 当使用ParalOld时,FullGC发生的时候是 ParallNew +ParallOld.

3.Q3

问题:JVM里的有几种classloader,为什么会有多种?

  1. 启动类加载器:负责加载JRE的核心类库,如jre目标下的rt.jar,charsets.jar等
  2. 扩展类加载器:负责加载JRE扩展目录ext中JAR类包
  3. 系统类加载器:负责加载ClassPath路径下的类包
  4. 用户自定义加载器:负责加载用户自定义路径下的类包

为什么会有多种?

  1. 分工,各自负责各自的区块
  2. 为了实现委托模型

4.Q4

问题:什么是双亲委派机制?介绍一些运作过程,双亲委派模型的好处;

  如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的 加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载 器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式,即每个儿子都不愿意干活,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己想办法去完 成,这不就是传说中的双亲委派模式。

在这里插入图片描述

双亲委派的好处:
沙箱安全机制:自己写的String.class类不会被加载,这样便可以防止核心API库被随意篡改 避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次 。

5.Q5

问题:什么情况下我们需要破坏双亲委派模型?
双亲委托有个弊端:

  • 不能向下委派,不能不委派

怎么打破双亲委派机制:(也就是能向下委派和不委派)

  • 自定义类加载器(不委派)
  • spi机制(向下委派)

打破双亲委派的两种方式:

  1. 通过spi机制,使用ServiceLoader.load去加载
  2. 通过自定义类加载器,继承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文件结构

请添加图片描述

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/122685462

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。