垃圾收集器(摘抄的深入理解JAVA虚拟机)

本文详细介绍了Java虚拟机中各种垃圾收集器的工作原理及其特点,包括Serial、ParNew、Parallel Scavenge等新生代收集器,以及Serial Old、Parallel Old、CMS和G1等老年代收集器,并解释了它们的应用场景。

垃圾收集器有很多种,针对不同的内存区域采用不同的垃圾收集器。

一、Serial收集器(新生代)

它依然是虚拟机运行在Client模式下的默认新生代收集器。

二、ParNew收集器(新生代)

ParNew收集器其实就是Serial收集器的多线程版本


运行在Server模式下的虚拟机中首选的新生代收集器

●并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状
态。
●并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能
会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

三、Parallel Scavenge收集器(新生代)

Parallel Scavenge收集器的目标是达到
一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总
消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚
拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

虚拟机会根据当前系统的运行情况收集性能监控信
息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种调节方式称为GC
自适应的调节策略(GC Ergonomics)。

四、Serial Old收集器(老年代)

Serial  Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整
理”算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。

五、Parallel Old收集器(老年代)

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。

一般配合Parallel Scavenge收集器使用


六、CMS收集器(老年代)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集
器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重
视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常
符合这类应用的需求。

从名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“标记—清除”算法实现
的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)

解析一下cms收集器的步骤:

1,初始标记会stop the world,这个过程非常的快,只会记录gc roots关联的目标。

2,这个过程和执行的程序并发完成,缺点是会占用cpu资源,优点是不会stop the world

3,重新标记和初始标记执行方式一致,但是它是为了清除做准备

4,开始清除,但是这个不会stop the world。优点就是不会stop the world,缺点有三点

第一点:会占用cpu资源。第二点:会有浮动垃圾。

第三点:因为在清除时要预留空间给其他程序使用,所以要在堆内存预留空间,预留空间不足则会

出现concurrent mode failure,这时会使用serial old收集器收集垃圾,所以cms收集器必须配合serial old收集器来使用

cms的特点就在于步骤上:

1,由于stop the world时间很短,所以响应速度很快,

2,但是由于并发操作很多,所以吞吐量不高,占用cpu资源比较多

3,由于其使用标记-清除算法,会有空间碎片,需要整理碎片。当有大对象的时候会提前出发一次full-GC

七、G1收集器(老年代)

在G1收集器中,Region之间的对象引用以及其他收集器中的新生代与老年代之间的对象
引用,虚拟机都是使用Remembered Set来避免全堆扫描的。G1中每个Region都有一个与之对
应的Remembered Set,虚拟机发现程序在对Reference类型的数据进行写操作时,会产生一个
Write Barrier暂时中断写操作,检查Reference引用的对象是否处于不同的Region之中(在分代
的例子中就是检查是否老年代中的对象引用了新生代中的对象),如果是,便通过
CardTable把相关引用信息记录到被引用对象所属的Region的Remembered Set之中。当进行内
存回收时,在GC根节点的枚举范围中加入Remembered Set即可保证不对全堆扫描也不会有遗
漏。
如果不计算维护Remembered Set的操作,G1收集器的运作大致可划分为以下几个步骤:
初始标记(Initial Marking)
并发标记(Concurrent Marking)
最终标记(Final Marking)
筛选回收(Live Data Counting and Evacuation)




选用收集器的参数

-UseSerialGC   client模式下的默认收集器,采用serial+serial old组合

-UseParallelGC  server模式下的默认收集器,采用parallel scavenge + serial old 组合

-UseParNewGC 打开后使用Parnew + serial old 组合

-UseConcMarkSweepGC 打开后使用parnew + cms + serial old组合(追求响应速度

-UserParallelOldGC 打开后使用parallel scavenge + parallel old组合(追求吞吐量

可以看到,serial old收集器还是很强势的,除了parallelold用不到以外基本都用到了

更多参数参考<深入理解JAVA虚拟机>3.5.9章节






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值