垃圾回收器

垃圾回收器
垃圾回收器分类
1、按线程数分:可以分为串行垃圾回收器和并行垃圾回收器
(1)串行回收是指在同一时间内只允许一个CPU进行垃圾回收操作,此时工作线程停止,直到垃圾回收操作结束。(适合单核cpu或者应用内存硬件较差的场合)
(2)并行收集可以多个CPU同时进行垃圾回收,因此提升了应用的吞吐量,不过并行回收和串行回收一样,使用stw机制

2、按工作模式分:可以分为并发式垃圾回收器和独占式垃圾回收器
(1)并发式垃圾回收器与应用线程交替工作,以尽可能减少应用程序的停顿时间。
(2)独占式垃圾回收器一旦运行,就会有stw机制,让应用线程暂停,直接垃圾回收操作结束。

评估GC的性能指标
吞吐量:运行用户代码的时间占总运行时间的比例
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
在这里插入图片描述

3、七种经典的垃圾回收器
(1)串行回收器:Serial / Serial Old
(2)并行回收器:ParNew Parallel Scavenge /Parallel Old
(3)并发回收器:CMS G1

4.1、Serial回收器:针对新生代,采用复制算法、串行回收和stw机制的方式进行垃圾回收,简单而高效。
4.2、Seria Old回收器:同样采用串行回收、stw机制,只不过采用标记-压缩算法。
5.1、ParNew回收器:新生代并行回收器,实际上式Seria回收器的多线程版本,同样在新生代采用复制算法,stw机制。
对于新生代,垃圾回收频繁的话,使用并行方式高效
对于老年代,回收次数少,使用串行方式节省资源。
在单个CPU的环境下,ParNew收集器不比Serial 收集器更高效

5.2、Parallel回收器:吞吐量优先
Parallel Scavenge回收器(复制算法):新生代并行回收器,追求高吞吐量,高效利用CPU,适用于与后台交互不高的场景。
Parallel Old回收器(标记-整理算法)
CMS垃圾回收器(标记-清除算法):Concurrent Mark-Sweep,是以牺牲吞吐量的代价来获得最短回收停顿时间的垃圾回收器,对于要求服务器响应的应用上,这种垃圾回收器非常适合。CMS使用的是标记-清除算法,所以在GC的时候会产生大量的内存碎片。当剩余内存无法满足程序运行的时候,系统就会出现Concurrent Mode Failure,临时CMS会采用Serial Old垃圾回收器进行垃圾清除,这个时候性能就会变差。
主要有4个过程:
初始标记:暂停所有的其他线程,来标记出与GC Roots直接关联的对象,速度很快。
并发标记:同时开启GC和用户线程,从与GC Roots直接关联的对象从上到下下开始遍历,整个过程用时较长,但是不需要停顿用户线程。
重新标记:为了修正并发标记期间,因用户程序继续运行导致标记产生变动的那一部分对象的标记记录,这个阶段用时比初始标记阶段长一些但是远远小于并发标记阶段。
并发清除:这个阶段清理删除那些标记阶段判断为死亡的对象,释放内存空间,GC和用户线程并发执行。
在初始标记和重新标记阶段会STW,暂停所有程序中的工作线程,但是时间比较短。

优点:并发收集,低延迟
缺点:
(1)会产生内存碎片导致并发清除后,用户线程可用的空间不足,在无法分配大对象的情况下,会提前出发Full GC。
(2)CMS收集器对CPU资源非常敏感。在并发阶段,虽然不会让程序暂停,但是会占用一部分的线程而导致应用程序变慢,总吞吐量变低。
(3)CMS收集器无法处理浮动垃圾。在并发标记阶段,由于程序的工作线程和垃圾回收线程是同时执行,所以在并发标记阶段如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些垃圾对象没有被及时回收,从而只能在下一次GC的时候回收这些刚产生的垃圾。
在JDK14的时候,已经被删除了。。

6、G1回收器
G1回收器是唯一一个同时可以用于新生代和老年代的垃圾回收器,采用标记-整理算法,不会产生内存碎片,该收集器把堆分成许多大小不相等的region,并且维护了一个优先列表,每次根据允许的收集时间,优先回收价值自大的region。是一个面向服务端的垃圾回收器,主要针对多核CPU以及大容量内存的机器。

Remebered Set记忆集
Remebered Set记忆集是在新生代中,每个region中的Remebered Set记录了被其他region引用的情况。
程序对reference类型的数据进行写操作的时候,会生成一个write barrier暂时中断操作,然后判断该对象和reference类型的数据是否在同一个region中,如果不在的话就记录下是哪一个region。在进行垃圾回收的时候,在GC Roots根节点的枚举范围中加上这个remebered Set,这样就可以实现不扫描整个堆也不会遗漏。
优点:
并行性:在G1回收期间,可以有多个垃圾回收线程同时工作,有效利用CPU,这个时候STW。
并发性:G1拥有和应用程序交替执行的能力,部分工作可以与应用程序同时进行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用程序的情况。
分代收集
从分代上看,G1依然属于分代型垃圾回收器,任然有那些带,但是从堆得结构上来看,不在要求地址连续,也不要求大小限制。
**空间整合:**G1把内存分为一个个region,内存的回收是已region作为单位回收的,region之间采用复制算法,但整体上可以看做是标记-整理算法,都可以避免内存碎片。这种特性有利于程序长时间运行,不会因为在分配大对象的时候因为无法找到连续的内存空间而提前触发GC。尤其是java堆空间很大的时候,G1的优势更加明显。

G1垃圾收集器的缺点:

  • 相较于 CMS,G1 还不具备全方位、压倒性优势。比如在用户程序运行过程中,G1 无论是为了垃圾收集产生的内存占用还是程序运行时的额外执行负载都要比 CMS 要高
  • 从经验上来说,在小内存应用上 CMS 的表现大概率会优于 G1,而 G1 在大内存应用上则发挥其优势。平衡点在 6-8GB 之间

工作原理
如果不计算维护 Remembered Set 的操作,G1 收集器的运作大致可划分为以下几个步骤:
● 初始标记 与 CMS 收集器一样
● 并发标记 与 CMS 收集器一样
● 最终标记:和 CMS 收集器的重新标记差不多,最终标记的区别在于虚拟机将在并发标记时标记
变化的对象记录在线程的 Remembered Set Logs 里面,然后把 Remembered Set Logs 的数据合并到
Remembered Set 中。这阶段需要停顿线程(stop the world),但是可多线程执行最终标记。
● 筛选回收:首先对各个区域中的回收价值和成本进行排序,根据用户所期望的 GC 停顿时间来
制定回收计划。
具备如下特点:
● 空间整合(不出现内存碎片):是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
● 可预测的停顿:能让用户明确指定在一定时间内,消耗在 GC 上的时间最多不得超过多少

G1 的三个 GC 的概念:
YoungGC:就是你的 Eden 区满了之后可能会触发的,但是会先去计算一下回收这个 Eden 区的
时间,如果远远小于先前设定的期望停顿时间,说明我现在的 Eden 区其实太小了,垃圾并不多,不
需要触发 youngGC,会新增一些 Eden 区。知道计算回收时间大于等于 200ms 的时候才会去真的触
发 YoungGC
MixGC 和 CMS 的 FullGC 类似:老年代所占比例大于等于设定的比例了,就会触发 MixGC,
会回收所有的年轻代和部分的老年代。为什么是部分呢。因为要根据你最大的停顿时间,计算回收
效益比,决定回收那些区域。(这就是G1垃圾回收器可以控制STW停顿时间的原因)
FullGC:整个程序停止,底层就单线程去回收进行标记清楚和整理。什么时候触发呢,就是在
MixGC 的时候,在进行复制算法的时候,没有更多的空间供你复制的时候,就会触发 FULLGC
产生 Full GC 的原因:

  • 晋升时没有足够的空间存放晋升的对象
  • 并发处理过程完成之前空间耗尽,浮动垃圾
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值