七、JVM
一、JVM 基础
一篇文章掌握整个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。
对象什么时候会进⼊⽼年代?
三、垃圾回收
垃圾收集算法了解吗?
标记-清除算法
标记-整理算法
复制
知道有哪些垃圾收集器吗?
CMS收集器
:老年代的收集器,采⽤ 标记-清除算法,回收停顿时间 最短。G1收集器
:开创了 局部收集的设计思路 和 基于Region 的内存布局形式。
什么是 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()