垃圾收集器
1. Serial收集器
- 单线程最古老的收集器,作用在新生代,使用复制算法,老生代使用标记-整理算法。
- 在收集工作的时候会发生stw(stop the world,其他工作线程都会停止工作)
- 单线程工作:简单而高效(没有线程切换的开销,有着很高的单线程工作效率)
- 是虚拟机client模式下的默认新生代收集器。
2.ParNew收集器
- serial的多线程版本,作用于新生代,使用复制算法,老生代使用标记-整理算法
- 多线程环境下他的工作效率可能还不如serial收集器,单cpu情况下肯定不如serial
- 是虚拟机server模式下首选新生代收集器
- 只有parnew和serial才能和CMS合作运行
3.Parallel Scavenge
- 新生代收集器,使用复制算法,
- 关注点在于吞吐量(用户工作时间/总时间),(其他收集器工作重点在于停顿时间最短(垃圾回收的时间))吞吐量优先收集器
停顿时间短:适用于与用户交互多的场景,响应速度高,用户体验好
吞吐量高: 适用于在后台运算不需要太多交互的场景,高利率使用cpu时间
-XX:maxGCPauseMillis:回收的时间不超过设定的值,参数就是最大回收时间
-XX:GCTimeRatio:垃圾回收的时间占总时间的比例,1-99(默认值)
4. Serial old收集器
- serial收集器的老年代版本,单线程收集器,使用标记-整理算法。
- 给client模式下的虚拟机使用
- 用途
与 parallel scavenge搭配使用
作为CMS的预备,发生concurrent mode failure使用。
5. Parallel old收集器
- parallel scavenge的老生代版本,多线程,标记整理 算法
- parallel scavenge + parallel old组合,吞吐量优先
6. CMS(concurrent mark sweep)
- 作用在老年代,标记清除 算法,多线程,关注 最短停顿时间
- cms是第一个正真实现了并行的收集器,在cms工作过程中,用户进程和gc进程可以同时运行
- 工作流程
初始标记,标记和gc roots直接相关联的对象,耗时很短,会产生stw
并发标记,对所有对象进行扫描标记,耗时有点长,不是stw
重新标记,因为在标记的过程中,对象是动态变化的,所以要再次标记那些可能已经可以回收的对象,修正那些在并发标记过程中因为程序工作产生的变动的对象记录,是stw。时间:初始标记<重新把标记<并发标记
并发清除 标记-清除算法,
- 优点:
并发收集
低停顿
- 缺点:
对cpu敏感,(在并发阶段,会占用一部分线程导致程序运行缓慢)
无法回收浮动垃圾,(并发过程中用户程序还在运行,会有新的垃圾产生)
回收结束之后会产生很多碎片(标记-清除算法导致的)
6. G1收集器(garbage first)
- 面向服务端应用的垃圾收集器
- g1中将整个队分成了一个个region,回收的时候会一起回收新生代和老生代,新生代和老生代不再有物理上的隔离,但是仍然保存着新生代和老生代的概念
- 工作流程(整体的工作流程和cms很相似)
初始标记,标记和gc root直接相连的对象(停顿线程的时间很少)
并发标记,可达性分析,找到所有的对象,耗时比较长,但是可以并发执行
最终标记,修正在标记过程中用户程序运行导致的发生变化的对象
筛选回收 :优先回收回收价值最大的region(对region进行回收价值和代价的排序,根据用户期待的停顿时间进行回收)
- 优点
分代收集
可以预测的停顿,减少停顿时间是g1和cms共同关注。g1避免了扫描整个堆,而是会维护一个优先列表(remembered set),优先回收价值最大的region
并行与并发,使用多核多个cpu来回收,减短stw的时间
空间整合,region政策,整体上采用标记-整理的算法,但是在两个region 之间采用的是复制算法,两种都不会产生空间碎片
比较混乱,脑子比较空
也是爱虚拟机的一天
回归啦