栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

垃圾回收器总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

垃圾回收器总结

目录

一、Serial收集器

二、ParNew收集器

三、Parallel Scavenge收集器

四、Serial Old收集器

五、Parallel Old收集器

 六、CMS 老年代收集器

七、G1 比较新的回收器



最常使用到的垃圾回收器有如下几种:

下面依次展开介绍。

一、Serial收集器 (新生代收集器,串行GC)

Serial收集器是最基本、发展历史最悠久的收集器。

二、ParNew收集器 (新生代收集器,并行GC)  

Serial收集器的多线程版本

 

三、Parallel Scavenge收集器

(新生代收集器,并行GC) 

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器。

设计的初衷是为了尽量缩短STW 时间,GC 停顿时间的缩短是以牺牲吞吐量和新生代空间作为代价的。工作流程同 ParNew 收集器,这个收集器提供了一些参数,可以控制 STW 时间以及吞吐率

相当于承诺用户,在一定时间内就会完成一次  GC,哪怕清理的不是特别干净,但是也能很大程度上的清理到大部分垃圾了

四、Serial Old收集器

(老年代收集器,串行GC)

  相当于 Serial 收集器的老年代版本,基本特点差不多,也是单线程的方式进行标记回收的

五、Parallel Old收集器

(老年代收集器,并行GC)=>[老年代,并行,标记-整理 暂停所有用户进程] 

使用多线程完成标记整理,效率更高,但是消耗的 CPU 资源更多

 六、CMS 老年代收集器

并行 GC  =》(采用的是多线程 标记-清除)

  特点:尽可能缩短 STW 时间

 a) 初始标记 【初始标记】

       只是把和 GCRoot 直接相关的对象先标记出来

       【这个标记过程时间比较短,GCRoot 直接相关的对象不是很多】

  b)并发标记

      执行整个标记遍历的过程(从 GCRoot 开始,把所有能访问到的对象都遍历)

      不需要暂停用户线程,消耗的时间相对比较久,但是可以和用户线程并发

  注意:当进行并发标记的时候,由于用户线程也在执行,可能导致某个对象,刚刚标记成是不是垃圾之后,被应用代码一改,就成了垃圾了。

并发标记完成之后,标记得到的垃圾结果可能就和真实结果之间存在一定的误差~~

c)重新标记(CMS remark) 【STW】

  修正刚才的误差,由于刚才出现误差的毕竟是少数,重新标记代价不是很大,虽然 STW 了,用不了多少时间就结束了

d)并发清除(CMS concurrent sweep)

  多线程的方式把刚才的垃圾对象都释放掉(直接清除)  也可以和应用线程并发进行

优点:能够让STW时间尽量短

缺点:

        1.内存碎片

        2.GC操作和应用线程是并发执行的,就更吃CPU资源(对CPU较敏感)

七、G1 比较新的回收器

既能回收新生代,也能回收老年代

每个矩形区域为一个”region“

E 表示伊甸区

S 表示生存去

T 表示老年代

H 表示存放大对象的区域

G1 回收的时候不一定需要一次性的把整个内存都回收完,而是以region为单位进行回收

(回收的粒度更加精细)

针对新生代的 region 同样是使用复制算法进行回收

针对老年代的回收,类似于 CMS,但是有一定的差别

a)初始标记  和 CMS 类似,只去找 GCRoot 直接关联的对象,时间比较短,会涉及 STW

b)并发标记(Concurrent Mark),和应用线程并发执行,进行可达性分析,遍历所有的对象(不涉及 STW) 和 CMS 不一样的是,如果发现某个老年代 region 中已经没存活对象了,就直接回收掉,不去等最后一个环节回收了

 Garbage First

c)最终标记,为了修正第二步b)产生的误差  SATB(snapshot-at-the-begining)

d)筛选回收

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/298295.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号