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

本文目录如下:

  • 七、JVM
    • [一、JVM 基础](#一、JVM 基础)
    • 二、内存管理
    • 三、垃圾回收
      • 垃圾收集算法了解吗?
      • [什么是 Stop The World?](#什么是 Stop The World?)
      • [Minor GC、Major GC、Full GC 都是什么意思?](#Minor GC、Major GC、Full GC 都是什么意思?)
      • [Minor GC 什么时候触发?](#Minor GC 什么时候触发?)
      • [Major GC 和 Full GC 触发条件一般为:](#Major GC 和 Full GC 触发条件一般为:)
      • 对象什么时候会进入老年代?
      • 知道有哪些垃圾收集器吗?
      • [能详细说⼀下 CMS 收集器的垃圾收集过程吗?](#能详细说⼀下 CMS 收集器的垃圾收集过程吗?)
      • [G1 垃圾收集器了解吗?](#G1 垃圾收集器了解吗?)
      • [有了 CMS,为什么还要引入 G1?](#有了 CMS,为什么还要引入 G1?)
    • [四、JVM 调优](#四、JVM 调优)
      • [有哪些常用的命令行 性能监控 工具?](#有哪些常用的命令行 性能监控 工具?)
      • [频繁 Minor GC 怎么办?](#频繁 Minor GC 怎么办?)

七、JVM

一、JVM 基础

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

什么是Java虚拟机?

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

Java对象 创建过程?

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

对象有哪几种引用?

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

二、内存管理

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

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

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

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

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

  • 静态集合类 :静态集合的 生命周期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 的频率。


相关推荐
霍霍哈嗨12 分钟前
【基础算法总结】分治--快排+归并
开发语言·算法·leetcode
caimouse18 分钟前
C#里使用最简单的线程调用界面更新的方法
开发语言·c#
编啊编程啊程19 分钟前
一文上手SpringSecurity【九】
java·spring boot·redis·spring cloud·json
AnFany29 分钟前
数据结构编程实践20讲(Python版)—01数组
开发语言·数据结构·python·深度优先·动态规划
2401_8576100343 分钟前
Spring Boot 点餐系统:一键订餐解决方案
java·spring boot·后端
尘浮生1 小时前
Java项目实战II基于Java+Spring Boot+MySQL的新闻稿件管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·maven·intellij-idea
lzhdim1 小时前
Ini文件读写配置工具类 - C#小函数类推荐
开发语言·前端·python·c#
希忘auto1 小时前
详解Java之继承与多态
java
前端李易安1 小时前
javaScript中如何实现函数缓存,案例解析
开发语言·javascript·缓存
十七算法实验室1 小时前
Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)
开发语言·python·算法·支持向量机·matlab·逻辑回归·启发式算法