前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >阿里二面JVM相关面试题

阿里二面JVM相关面试题

作者头像
用户4919348
发布2022-04-13 16:07:06
2000
发布2022-04-13 16:07:06
举报
文章被收录于专栏:波波烤鸭

  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文件结构

请添加图片描述
请添加图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题
  • 二,解答
    • 1.Q1
      • 2.Q2
        • 3.Q3
          • 4.Q4
            • 5.Q5
              • 6.Q6
                • 7.Q7
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档