垃圾收集器
Serial 垃圾收集器 (单线程、 复制算法)
- Serial是最基本垃圾收集器,
- 新生代
- 复制算法,
- 单线程
- 曾经是JDK1.3.1之前新生代唯一的垃圾收集器。
- Serial 是一个单线程的收集器,它不但只会使用一个 CPU 或一条线程去完成垃圾收集工
作,并且在进行垃圾收集的同时,必须暂停其他所有的工作线程,直到垃圾收集结束。 - Serial 垃圾收集器虽然在收集垃圾过程中需要暂停所有其他的工作线程,但是它简单高效,对于限
定单个 CPU 环境来说,没有线程交互的开销,可以获得最高的单线程垃圾收集效率, - 因此 Serial垃圾收集器依然是 java 虚拟机运行在 Client 模式下默认的新生代垃圾收集器。
ParNew 垃圾收集器(Serial+多线程)
- ParNew垃圾收集器是Serial收集器的多线程版本
- 新生代
- 复制算法
- 多线程
- 除了使用多线程进行垃圾回收之外,其余和serial收集器完全一样
- ParNew垃圾收集器在垃圾收集过程中也同样要暂停所有的其他工作线程
- ParNew默认开启和cpu数目相同的线程数,可以通过-XX:ParallGCThreads参数来限制垃圾收集器的线程数
- ParNew虽然是除了多线程外和Serial收集器完全一样,但ParNew垃圾收集器是很多Java虚拟机运行在Server模式下新生代的默认垃圾收集器
Parallel Scavenge垃圾收集器(多线程复制算法、高效)
- 新生代
- 复制算法
- 多线程
- 吞吐量优先
- 它重点关注是程序达到一个可控制的吞吐量
吞吐量(Throughput):CPU用于运行用户代码的时间 / CPU总消耗时间,
即 运行用户代码时间 / (运行用户代码时间 + 垃圾回收时间)
高吞吐量可以高效率的利用CPU时间,尽快的完成程序的运算任务
- 主要适用于在后台运算而不需要太多交互的任务
- 自适应调节策略也是ParallelScavenge 与 ParNew的一个重要区别
Serial Old 垃圾收集器(单线程标记整理算法)
- Serial 的年老代版本
- 年老代
- 标记整理算法
- 单线程
- 主要运行在 Client 模式下默认的年老代垃圾收集器
- 在server模式下的用途:
1.在JDK1.5之前版本中与新生代的ParallelScavenge搭配使用
2.作为年老代中使用CMS收集器的后备方案
Parallel Old 垃圾收集器(多线程标记整理算法)
- ParallelScavenge的年老代版本
- 年老代
- 标记整理算法
- 多线程
- 吞吐量优先
JDK1.6之前,新生代使用ParallelScavenge 搭配 年老代Serial Old,只能保证新生代的吞吐量优先,无法保证整体的吞吐量
ParallelOld正是为了在年老代同样提供吞吐量优先的垃圾收集器
CMS 垃圾收集器(多线程标记清除算法)
- 年老代
- 多线程
- 标记清除算法
- 主要目标获取最短垃圾回收停顿时间
- 最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验
- 相比其他收集器较为复杂
CMS工作过程
1.初始标记
- 标记GC Roots能直接关联的对象,
- 速度快,
- 需要暂停所有的工作线程
2.并发标记
- 进行GC Roots跟踪的过程,和用户线程一起工作,
- 不需要暂停工作线程
3.重新标记
- 为了修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录 ,
- 需要暂停所有工作线程
4.并发清除
- 清除GC Roots不可达对象,和用户线程一起工作,
- 不需要暂停工作线程
- 由于耗时最长的并发标记和并发清除过程中,垃圾回收线程可以和用户线程一起并发工作,
- 所以,总体看来CMS收集器的内存回收和用户线程是一起并发执行的
G1 收集器
- Garbage First垃圾收集器是目前垃圾收集器理论发展最前沿的成果,相比CMS收集器,G1两个突出的改进:
- 基于标记整理算法,不产生内存碎片
- 可以非常精确的控制停顿时间,在不牺牲吞吐量的前提下,实现低停顿垃圾回收
- G1 避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域
- 跟踪区域的垃圾收集进度
- 维护一个优先级列表
- 根据所允许的收集时间,优先回收垃圾最多的区域
- 区域划分和优先级区域回收机制,确保G1可以在有限的时间内获得最高的垃圾收集效率
(未完待续)