文章目录
- 前言
- 一、HotSpot 虚拟机的垃圾收集器
- 二、年轻代垃圾收集器
-
- 1、 串行收集器 ( Serial )
- 2、 ParNew 收集器
- 3、 Parallel Scavenge 收集器
- 二、老年代垃圾收集器
前言
参考 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 ) 博客 ;
一、HotSpot 虚拟机的垃圾收集器
HotSpot 虚拟机的垃圾收集器 : 上层的是 年轻代 内存区域的垃圾收集器 , 下层是 老年代 内存区域的垃圾收集器 , Tenured generation 就是老年代 ;
年轻代的垃圾回收器 :
- Serial
- ParNew
- Parallel Scavenge
老年代的垃圾回收器 :
- CMS
- Serial Old ( MSC )
- Parallel Old
Serial 垃圾回收器 是 单线程垃圾收集器 , 垃圾回收时 , 需要暂停当前的 Java 线程 , 进行垃圾回收 , 这样会造成程序卡顿 ;
ParNew 垃圾回收器 是 多线程的垃圾收集器 , 是 Serial 垃圾回收器 的 多线程版本 ;
二、年轻代垃圾收集器
1、 串行收集器 ( Serial )
串行收集器 ( Serial ) : 新生代内存回收使用该回收机制 ;
① 运行内存区域 : Serial 串行垃圾回收器 在 年轻代 内存区域中收集要回收的内存 ;
② 垃圾回收算法 : 复制算法 ;
③ 运行机制 : 垃圾回收线程运行时 , 暂停用户线程 ;
④ 最基本 GC : Serial 串行垃圾回收器 , 这是最基本的垃圾回收器 , 老版本的 Java 虚拟机使用的就是这种垃圾回收器 ;
⑤ 特点 : 其工作时 , 是单线程 , 串行的 ;
⑥ 单线程执行 : 该垃圾回收器 , 需要暂停所有线程 , 使用单个线程处理回收多个线程的内存回收工作 ;
⑦ 暂停线程 : 执行垃圾回收时 , 必须暂停工作线程 , 直到垃圾收集结束后 , 才能绘制执行 ;
⑧ 安全点 : 停止工作线程的位置是 安全点 , 需要保存该位置的程序执行信息 ;
⑨ 优势 : 不需要处理多线程交互问题 ;
年轻代 , 复制算法 , 单线程 GC , 暂停用户线程
2、 ParNew 收集器
ParNew 收集器 :
① 运行区域 : ParNew 垃圾回收器 在 年轻代 内存区域中收集要回收的内存 ;
② 垃圾回收算法 : 复制算法 ;
③ 运行机制 : 垃圾回收线程运行时 , 暂停用户线程 ;
④ 多线程执行 : 该垃圾回收器 多线程运行 , 消耗时间要比 Serial 串行垃圾回收器要短 ;
⑤ 与 Serial 垃圾回收器对比 : 该 GC 是并行的 , 是 Serial 垃圾回收器的多线程版本 ;
年轻代 , 复制算法 , 多线程 GC , 暂停用户线程
3、 Parallel Scavenge 收集器
Parallel Scavenge 收集器 :
① 运行区域 : Parallel 垃圾回收器在 年轻代 内存区域中收集要回收的内存 ;
② 垃圾回收算法 : 复制算法 ;
③ 关注吞吐量 : Parallel 垃圾回收器 与 ParNew 垃圾回收器 区别是 , Parallel 垃圾回收器更关注吞吐量 ;
④ 吞吐量概念 : 吞吐量是 CPU 运行正常代码时间与总的消耗时间之间的比值 , CPU 运行的总时间是 程序运行时间 与 GC 垃圾收集的时间之和 ;
⑤ 吞吐量示例 : CPU 总共运行 100 秒 , 程序运行 95 秒 , 垃圾回收器运行 5 秒 , 那么吞吐量就是
;
年轻代 , 复制算法 , 多线程 GC , 暂停用户线程 ( 关注吞吐量 )
二、老年代垃圾收集器
1. CMS 垃圾回收器 : 全称 Concurrent Mark Sweep , 并发标记清除收集器 ;
① 运行区域 : CMS 垃圾回收器在 老年代 内存区域中收集要回收的内存 ;
② 垃圾回收算法 : 标记-清除算法 , 会产生很多内存碎片 ;
2. 短暂停顿 : 在 GC 线程运行时 , 用户线程仅做最短的停顿 , 在停顿过程中主要用于标记内存 ;
由于其停顿时间是各个 GC 算法中最短 , 该并发标记清除收集器又叫 并发低延迟收集器 ;
3. CMS 收集器工作流程 ( 重点 ) : 要标记
次后 , 才可以执行清除操作 , 共
步骤 ;
① 初始标记 : 标记与 GC Roots 有引用链的对象 ; 该操作速度快 , 该步骤需要暂停用户线程 ;
② 并发标记 : GC Roots 追踪 , 从初始标记结果集合中标记出存活对象 , 不能保证所有的存活对象都被标记 ; 该步骤与应用程序并发执行 ;
③ 重新标记 : 上一步并发标记 GC 线程与用户程序并发期间的标记有部分变化 , 修正这部分标记信息 , 之后暂停用户线程 , 开始标记 ; 该暂停操作要比初始标记步骤暂停时间长 ;
④ 并发清除 : 回收所有 GC Roots 不可达对象 ;
上述四个步骤中 , 并发标记 , 并发清除 , 用时最长 , 但这两个与用户线程并发执行 , 因此可以看做该 CMS 垃圾收集器与用户线程是并发执行的 ;
4. CMS 收集器缺点 :
① CPU 性能消耗 : 多开线程 , 意味着 CPU 性能消耗多 ;
② 内存碎片 : 使用 标记-清除算法 , 会造成很多内存碎片 , 严重的话导致 OOM ;
③ 浮动垃圾 : 由于 GC 线程 与用户线程并发 造成的 , 在 GC 运行过程中产生的用户线程垃圾 , 需要等待下一次 GC 清理 , 这些垃圾就是浮动垃圾 ;