gc --- 对象回收3

109 阅读4分钟

垃圾收集器

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 之间采用的是复制算法,两种都不会产生空间碎片


	比较混乱,脑子比较空
	也是爱虚拟机的一天
	回归啦