3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

本文目录如下:

  • 七、JVM
    • 一、JVM 基础
      • 什么是Java虚拟机?
      • Java对象 创建过程?
      • 对象有哪几种引用?
    • 二、内存管理
      • 说⼀下 JVM 的内存区域 (堆 和 栈)?
      • 内存溢出 和 内存泄漏 是什么意思?
      • 内存泄漏可能由哪些原因导致呢?
      • Java 堆的内存分区了解吗?
      • 对象什么时候会进⼊⽼年代?
    • 三、垃圾回收
      • 垃圾收集算法了解吗?
      • 什么是 Stop The World?
      • Minor GC、Major GC、Full GC 都是什么意思?
      • Minor GC 什么时候触发?
      • Major GC 和 Full GC 触发条件一般为:
      • 对象什么时候会进入老年代?
      • 知道有哪些垃圾收集器吗?
      • 能详细说⼀下 CMS 收集器的垃圾收集过程吗?
      • G1 垃圾收集器了解吗?
      • 有了 CMS,为什么还要引入 G1?
    • 四、JVM 调优
      • 有哪些常用的命令行 性能监控 工具?
      • 频繁 Minor GC 怎么办?

七、JVM

一、JVM 基础

一篇文章掌握整个JVM,JVM超详细解析!!!

什么是Java虚拟机?

  • Java虚拟机(JVM) 是用来 解析和运行Java程序 的一种 虚拟机
  • 编译器Java ⽂件 编译成 平台无关Java 字节码文件 (.class),对应平台 JVM字节码文件 翻译成 机器指令 并运⾏。

Java对象 创建过程?

  • 加载类
  • 分配内存
  • 初始化默认值
  • 设置对象头: 运行时数据(GC标志位等)、对象指针数组长度
  • 执行初始化方法

对象有哪几种引用?

  • 强引用:代码中普遍存在的 赋值引用强引用 关联的对象,不会被 垃圾收集器 回收。
  • 软引用强引用对象 置空 (NULL),保留 软引用软引用 关联的对象,二次回收 时进行回收。
  • 弱引用强引用对象 置空 (NULL),保留 软引用弱引用 关联的对象,会被 垃圾收集器 回收。
  • 虚引用:最弱的⼀种 引用关系,不会影响对象的 ⽣存时间

二、内存管理

说⼀下 JVM 的内存区域 (堆 和 栈)?

  • 程序计数器:保存当前线程所正在执行的 字节码指令的地址(行号)
  • 栈内存线程私有。方法执行时,Java 虚拟机栈 会同步创建⼀个 栈帧,⽤来存储 局部变量表操作数栈 等。
  • 堆内存线程共享堆内存 用于存放 对象实例 (垃圾收集器 管理的内存区域,也称 GC堆)。
  • 方法区线程共享。存储已被 虚拟机 加载的 类信息常量静态变量 等数据。
    3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优_第1张图片

内存溢出 和 内存泄漏 是什么意思?

  • 内存泄露:申请的 内存空间 没有被正确释放,导致 内存被占用
  • 内存溢出:就是申请的内存超过了 可用内存内存不够了

内存泄漏可能由哪些原因导致呢?

  • 静态集合类:静态集合的 生命周期JVM ⼀致,所以静态集合 引用的对象 不能被释放
  • 单例模式
  • 连接(IO/数据)未释放

Java 堆的内存分区了解吗?

  • Java 堆 划分为 新生代老年代 两个区域。
  • 新⽣代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代
  • 新⽣代 又可以分为三个区域:edenfromto,⽐例是 8:1:1

对象什么时候会进⼊⽼年代?

三、垃圾回收

垃圾收集算法了解吗?

  • 标记-清除算法
  • 标记-整理算法
  • 复制

什么是 Stop The World?

垃圾回收 时,会涉及 对象的移动。为了保证 对象引用 的正确性,必须 暂停所有线程,这样的停顿被称为 Stop The World。简称 STW


Minor GC、Major GC、Full GC 都是什么意思?

  • Minor GC (新生代GC)Minor GC 非常频繁回收速度 也比较快。
  • Major GC (老年代GC):通常执行 Major GC 会连着 Minor GC 一起执行。Major GC速度 要比 Minor GC 慢的多。
  • Full GC:对整个 Java 堆⽅法区 进行 垃圾回收

Minor GC 什么时候触发?

新创建的对象 优先在 新生代 Eden 区 进行分配,如果 Eden 区 没有足够的空间时,就会触发 Minor GC 来清理新生代。


Major GC 和 Full GC 触发条件一般为:

  • 晋升到老年代的对象 平均大小 > 老年代 剩余空间
  • Minor GC 后存活的对象超过了老年代剩余空间。
  • 老年代 空间不足
  • 执行 System.gc()

对象什么时候会进入老年代?

  • ⻓期存活的对象将进入老年代:每次 Minor GC 后对象的年龄会增加,当年龄到达 15 (默认) 之后,对象会被移入 老年代
  • ⼤对象直接进⼊老年代

知道有哪些垃圾收集器吗?

  • CMS收集器老年代的收集器,采⽤ 标记-清除算法回收停顿时间 最短。
  • G1收集器:开创了 局部收集的设计思路基于Region 的内存布局形式

能详细说⼀下 CMS 收集器的垃圾收集过程吗?

CMS 垃圾收集分为四步:

  1. 初始标记:标记 GC Roots直达的对象。需要 STW
  2. 并发标记:从 GC Roots 直达对象开始遍历整个对象图,找出要 回收的对象
  3. 重新标记:标记 并发标记阶段 产生的对象。需要 STW
  4. 并发清除:清理掉 标记阶段 标记的对象。

G1 垃圾收集器了解吗?

G1 收集器的运⾏过程⼤致可划分为以下四个步骤:

  1. 初始标记:标记 GC Roots直达的对象。需要 STW
  2. 并发标记:从 GC Roots 直达对象开始遍历整个对象图,找出要 回收的对象
  3. 最终标记:标记 并发标记阶段 产生的对象。需要 STW
  4. 筛选回收:选择多个 Region 构成 回收集,把回收集中 Region存活对象 复制到 空的 Region 中,再清理掉 旧 Region 的全部空间。需要 STW

有了 CMS,为什么还要引入 G1?

G1 主要解决了 内存碎片过多 的问题。

  • CMS 并发清除阶段 会导致 内存碎片比过多
  • CMS 并发清除阶段,用户线程依然在运行,会产生 浮动垃圾浮动垃圾 必须到 下⼀次垃圾收集 才能处理。浮动垃圾 太多会触发 新的垃圾回收,导致 性能降低

四、JVM 调优

有哪些常用的命令行 性能监控 工具?

操作系统工具:

  • top:显示 系统资源 使用情况
  • vmstat:监控 内存CPU
  • iostat:监控 IO 使⽤
  • netstat:监控 网络 使⽤

频繁 Minor GC 怎么办?

通常情况下,如果 新生代 空间较小,Eden 区 很快会被填满,就会导致 频繁 Minor GC,因此可以通过 增大新生代空间 -Xmn 来降低 Minor GC 的频率。


你可能感兴趣的:(Java后端面试题,CABR实习,jvm,java,开发语言)