本文目录如下:
- 七、JVM
-
- [一、JVM 基础](#一、JVM 基础)
-
- 什么是Java虚拟机?
- [Java对象 创建过程?](#Java对象 创建过程?)
- 对象有哪几种引用?
- 二、内存管理
-
- [说⼀下 JVM 的内存区域 (堆 和 栈)?](#说⼀下 JVM 的内存区域 (堆 和 栈)?)
- [内存溢出 和 内存泄漏 是什么意思?](#内存溢出 和 内存泄漏 是什么意思?)
- 内存泄漏可能由哪些原因导致呢?
- [Java 堆的内存分区了解吗?](#Java 堆的内存分区了解吗?)
- 对象什么时候会进⼊⽼年代?
- 三、垃圾回收
-
- 垃圾收集算法了解吗?
- [什么是 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 基础
什么是Java虚拟机?
- Java虚拟机(
JVM
) 是用来 解析和运行Java程序 的一种 虚拟机。- 编译器 将 Java ⽂件 编译成 平台无关 的 Java 字节码文件 (.class) ,对应平台 JVM 将 字节码文件 翻译成 机器指令 并运⾏。
Java对象 创建过程?
加载类
分配内存
初始化默认值
设置
对象头
: 运行时数据 (GC标志位 等)、对象指针 、数组长度。执行初始化方法
对象有哪几种引用?
强引用
:代码中普遍存在的 赋值引用 。强引用 关联的对象,不会被 垃圾收集器 回收。软引用
:强引用对象 置空 (NULL),保留 软引用 。软引用 关联的对象,二次回收 时进行回收。弱引用
:强引用对象 置空 (NULL),保留 软引用 。弱引用 关联的对象,会被 垃圾收集器 回收。虚引用
:最弱的⼀种 引用关系 ,不会影响对象的 ⽣存时间。
二、内存管理
说⼀下 JVM 的内存区域 (堆 和 栈)?
程序计数器
:保存当前线程所正在执行的 字节码指令的地址(行号)。栈内存
:线程私有 。方法执行时,Java 虚拟机栈 会同步创建⼀个 栈帧 ,⽤来存储 局部变量表 、操作数栈 等。堆内存
: 线程共享 。堆内存 用于存放 对象实例 (垃圾收集器 管理的内存区域,也称GC堆
)。方法区
:线程共享 。存储已被 虚拟机 加载的 类信息 、常量 、静态变量 等数据。
内存溢出 和 内存泄漏 是什么意思?
- 内存泄露 :申请的 内存空间 没有被正确释放,导致 内存被占用。
- 内存溢出 :就是申请的内存超过了 可用内存 ,内存不够了。
内存泄漏可能由哪些原因导致呢?
静态集合类
:静态集合的 生命周期 和 JVM ⼀致,所以静态集合 引用的对象 不能被释放。单例模式
连接(IO/数据)未释放
Java 堆的内存分区了解吗?
- Java 堆 划分为
新生代
和老年代
两个区域。- 新⽣代 存放 存活时间短 的对象,每次 垃圾回收 后存活的对象,将会逐步存放到 老年代。
- 新⽣代 又可以分为三个区域:eden 、from 、to ,⽐例是 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 垃圾收集分为四步:
初始标记
:标记 GC Roots 能 直达的对象 。需要 STW。并发标记
:从 GC Roots 直达对象开始遍历整个对象图,找出要 回收的对象。重新标记
:标记 并发标记阶段 产生的对象。需要 STW。并发清除
:清理掉 标记阶段 标记的对象。
G1 垃圾收集器了解吗?
G1 收集器的运⾏过程⼤致可划分为以下四个步骤:
初始标记
:标记 GC Roots 能 直达的对象 。需要 STW。并发标记
:从 GC Roots 直达对象开始遍历整个对象图,找出要 回收的对象。最终标记
:标记 并发标记阶段 产生的对象。需要 STW。筛选回收
:选择多个 Region 构成 回收集 ,把回收集中 Region 的 存活对象 复制到 空的 Region 中,再清理掉 旧 Region 的全部空间。需要 STW。
有了 CMS,为什么还要引入 G1?
G1
主要解决了内存碎片过多
的问题。
CMS
并发清除阶段 会导致 内存碎片比过多。CMS
并发清除阶段 ,用户线程依然在运行,会产生浮动垃圾
,浮动垃圾 必须到 下⼀次垃圾收集 才能处理。浮动垃圾 太多会触发 新的垃圾回收 ,导致 性能降低。
四、JVM 调优
有哪些常用的命令行 性能监控 工具?
操作系统工具:
top
:显示 系统资源 使用情况vmstat
:监控 内存 和 CPUiostat
:监控 IO 使⽤netstat
:监控 网络 使⽤
频繁 Minor GC 怎么办?
通常情况下,如果 新生代 空间较小,Eden 区 很快会被填满,就会导致 频繁 Minor GC ,因此可以通过 增大新生代空间
-Xmn
来降低 Minor GC 的频率。