java垃圾收集器概论

Serial收集器

Serial是一个单线程的收集器。单线程并不仅仅说明只使用一个CPU,更重要的是必须暂停所有其他工作(Stop the world)。
好比“你妈妈在为你打扫房间的时候,你不能再一旁乱扔纸屑,这样房间是打扫不完的”。
优点:简单而高效(与其他收集器的单线程相比),在限于单个CPU的环境,没有额外的线程交互的开销,所以能获得最高效率。
通常使用于Client,停顿时间可以控制在十几毫秒,最多一百毫秒以内。

ParNew收集器

ParNew收集器是Serial收集器的多线程版本。所有控制参数,收集算法,Stop the world,对象分配规则,回收策略等都和Serial收集器完全一样。
除了Serial,目前只能和CMS收集器配合工作。
运行在server模式下的虚拟机首选的新生代收集器。
缺点:单CPU环境,不及Serial。

Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代收集器,适用复制算法。
并行的多线程收集器。
与ParNew和CMS不同的是收集器目标。
CMS等收集器关注点在于尽可能缩短垃圾收集时用户线程停顿的时间。
Parallel Scavenge则是达到一个可控制的吞吐量。
吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集时间)。
所以也称为“吞吐量优先”收集器。

Serial Old收集器

单线程,使用标记整理算法。
主要给Client模式下的虚拟机用。
Server模式下可以和Parallel Scavenge配合使用,也可以作为CMS收集器的后备预案。

Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多线程和标记-整理算法。
配合Parallel Scavenge组成名副其实的“吞吐量优先”应用组合。

CMS收集器

CMS收集器是一种以获得最短回收停顿时间为目标的收集器。基于标记-清除算法。
分为4个步骤

  • 初始标记
  • 并发标记
  • 重新标记
  • 并发清除

初始标记:仅仅标记一下GC Roots能直接关联的对象,速度很快。
并发标记:进行GC Roots Tracing的过程
重新标记:为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。
并发清除:清除所有标记的对象。

初始标记耗时<重新标记耗时<并发标记耗时和并发清除耗时

整个过程中最耗时的并发标记和并发清除过程收集器线程都可以和用户线程一起工作,所以停顿时间是很短的。

缺点
1.并发导致应用程序变慢。
2.无法处理浮动垃圾。浮动垃圾就是在并发清除时,应用程序产生的垃圾。
3.标记清除算法导致碎片多。为此官方提供了一个碎片整合过程,相当于多次标记清除后再整理,但停顿时间边长了。

G1收集器

G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一。
G1是面向服务端应用的垃圾收集器。
特点:
1.并行与并发:利用多CPU缩短Stop the world
2.分代收集
3.空间整合:使用标记-整理算法
4.可预测的停顿:可以指定在一个时间片段内,消耗在垃圾收集的时间上不得超过一个阈值。

分区

G1的内存模型与其他收集器不太一样,它将整个java堆分为了大小相等的分区Region,虽然还保留了分代的概念,但是新生代和老年代已经不再是物理隔离的了,他们都是一部分Region(不需要连续)的集合。

卡片

在每个分区内部又被分成了若干个大小为512 Byte卡片(Card),标识堆内存最小可用粒度所有分区的卡片将会记录在全局卡片表(Global Card Table)中,分配的对象会占用物理上连续的若干个卡片,当查找对分区内对象的引用时便可通过记录卡片来查找该引用对象(见RSet)。每次对内存的回收,都是对指定分区的卡片进行处理。

Remember Set

G1收集器之所以能建立可预测的停顿时间模型,是因为他可以有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪每一个Region中的垃圾堆积的价值大小(回收的空间大小和所需要的时间),在后台维护一个优先队列,每次根据允许运行垃圾回收的时间,优先回收价值最大的那个Region。

工作流程

如果不计算维护Remember Set的操作,G1运行大致可以划分为以下步骤。

  • 初始标记
  • 并发标记
  • 最终标记
  • 筛选标记

初始标记:标记GC Roots能直接关联到的对象,并且修改TAMS(Next Top at Mark Start)。让下一阶段用户线程并发运行时可以正确在可用的Region中创建新的对象,这个阶段需要消耗线程但是耗时很短。
并发标记:从GC Roots开始对堆中的对象进行可达性分析,耗时长,可以与用户线程并发。
最终标记:修正并发标记期间因为用户线程导致标记变动的那一部分标记记录。变动记录在线程Remember Set Logs里面。需要停顿线程,但是可以并行执行。
筛选回收:在优先队列中排序,选出运行时间内价值最大的那个Region回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值