- 判断对象是否需要回收的策略
- 引用计数法
- 可达性分析
- 垃圾收集器
判断对象是否被引用,每被一个对象引用,引用计数+1
可达性分析从GCRoot开始查找进行可达性分析,若从GC Root出发可达,则对象还被引用,若不可达,则对象应该被回收
垃圾收集器| 收集器 | 适用年代 | 搭配的收集器 | 备注 |
|---|---|---|---|
| Serial | 年轻代 | CMS、Serial Old | |
| ParNew | 年轻代 | CMS、Serial Old | |
| Parallel Scanvenge | 年轻代 | Serial Old、Parallel Old | |
| CMS | 老年代 | Serial、ParNew、Serial Old | |
| Serial Old(MSC) | 老年代 | Serial、ParNew、Parallel Scanvenge、CMS | |
| Parallel Old | 老年代 | Parallel Scanverge | |
| G1 | 年轻代、老年代 | 面向未来 |
-
Serial
单线程收集垃圾,新生代采用复制算法
在Client模式下效率比较高,没有线程之间的切换 -
ParNew
Serial收集器的多线程版本
Server模式下虚拟机的首选新生代收集器,除Serial收集器外,只有ParNew可以和CMS配合
jdk配置参数中使用-XX:+UserConcMarkSweepGC选项后的首选新生代收集器;或者使用-XX:+UserParNewGC强制指定 -
Parallel Scanvenge
使用复制算法、多线程,和ParNew不同的是Parallel Scanvenge关注吞吐量,提供-XX:MaxGCPauseMillis参数控制GC最大停止时间,提供-XX:GCTimeRatio参数设置吞吐量。 -
Serial Old(MCS)
单线程老年代收集器,采用标记整理算法
一种用途是在jdk 1.5之前与Parallel Scanvenge收集搭配使用
另一种用途是当CMS并发收集发生Concurrent Mode Failure时使用,在CMS老年代收集时,剩余空间不够分配对象,会转而用Serial Old收集器收集对象 -
Parallel Old
Parallel Old是Parallel Scanvenge收集器的老年代版本,在jdk 1.6后与Parallel Scanvenge搭配
在1.5时期,Parallel Scanvenge与Serial old使用,由于Serial Old的局限限,无法利用服务器多核cpu优势回收老年代,两种搭配使用效果吞吐量有时不如ParNew与CMS搭配使用效果 -
CMS
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。步骤一共分为四个:初始标记、并发标记、重新标记、并发清除。其中并发处理的过程有并发标记和并发清除,初始标记和重新标记都是单线程处理。
缺点
a.无法处理浮动垃圾,会出现Concurrent Mode Failure的失败导致Full GC。由于并发清理阶段用户线程还可以继续运行,会产生新的垃圾,这些垃圾只能到下一次GC时才会被收集,因此需要预留空间给用户线程。在jdk1.6中默认老年代使用了68%内存时会触发GC,在1.6中设置为92%,当GC并发清理期间内存无法满足用户线程需要,就会出现Concurrent Mode failed失败,然后虚拟机采用Serial Old收集器收集内存
b.由于采取标记清除算法收集,会产生很多内存碎片,当有大对象需要分配内存时会触发fullGC -
G1
初始标记
并发标记
最终标记
筛选回收



