【深入理解JVM】-垃圾收集器详解

Serial收集器

特点:

单线程,相对于多线程不会发生因为线程交互带来损耗,在客户端单核处理器下是运行速度最快的。

并行的,会发生stw(垃圾收集的时候只有收集器在工作),因为在客户端留给虚拟机的内存空间很小垃圾回收速度很快,stw时间很短。

 

ParNew收集器

特点:

看做是serial收集器的多线程版本,在单核处理器下serial更快,但在服务端多核处理器下parnew更快,通过用-XX:ParallelGCThreads可以现在多核多核处理下parnew并行的数量

可以和cms收集器搭配让parnew地位提高,随着G1的出现parnew成为了cms处理新生代的一部分,单独设定parnew的语句废除掉了,只能通过设定cms来使用parnew。

Parallel Scavenge收集器

特点:

也是并行的收集器相比parnew,此收集器更注重吞吐量

参数:

设定stw时间(-XX:MaxGCPauseMillis),不能设定的太小,若小的话系统就会自动减少新生代的内存(这样垃圾收集的时间变短stw变短),垃圾回收的频率就会增加,同时还会降低吞吐量(运行100s两次垃圾收集每次10秒,现在运行100s5次垃圾收集每次5s)。

直接设定垃圾收集时间占总时间的比率(-XX:GCTimeRatio)。

设定自适应调节(-XX:+UseAdaptiveSizePolicy),当对虚拟机结构不了解的情况下可以把该参数打开,设定了xms,stw时间,和垃圾收集时间占总时间的比率后就可以自动为虚拟机调优,这也是区别是Parallel Scavenge还是parnew收集器的重要标志。

Serial Old收集器

特点:

是serial new的老年代版本,也是单线程的,运用与客户端

也可以用在服务端,和Parallel Scavenge搭配使用,也可以和parnew+cms组合搭配作为cms的预备版本。

 

Parallel Old收集器

特点:

Parallel Scavenge和Serial Old因为Serial Old的拖累在吞吐量还没有parnew+cms高,直到Parallel Old出现,Parallel Scavenge+Parallel Old组合适用于处理器资源稀缺而且要求吞吐量高的服务器使用。

CMS收集器

特点:

cms收集器是并发收集器,允许用户线程和收集器线程一起执行

步骤:

初始标记:

该阶段是标记和gcroot结点直接连接的结点,是单线程的并行的,不允许用户线程一起执行,但stw时间十分短可以忽略不计

并发标记:

继续标记从gcroot向下延伸的全部结点,是多线程并发的。

重新标记:

记录并发标记阶段因用户线程发生变化的标记对象,多线程,并行的。

并发清除:

回收标记阶段判断死亡的对象进行垃圾收集,并发的多线程的。

 

缺点:

当服务器小于4核时,cms会占用大量的内存,大于4核时会占用25%的内存。

cms收集是并发的,为了给用户线程留足够的空间,老年代不能内存满再进行垃圾收集,若老年代空余的内存不够运行用户线程,就会终止cms冻结用户线程,同时启用serial old来收集。

在垃圾收集阶段是并发的,还会有用户线程在该阶段产生垃圾,这些垃圾称为浮动垃圾不能在当次垃圾收集回收掉。

垃圾收集阶段是标记清理,当再存大容量的数据时很可能因为没有足够空间存放导致full gc从而造成更长的stw。

Garbage First收集器

特点:

内存不像传统垃圾收集器被分为新生代,老年代,而是被分为了一个个region区域,某些region区域的集合为新生代,某些为老年代,没有固定的大小。当存放对象的大小超过了半个region区大小就会存放在由两个region区联合构成的Humongous区中。

可以指定具体的stw时间,根据指定的stw时间和上边的,找到有最大收益的region区域,估算出每块region区域大致的收集时间,开始分配具体的region区域收集。

每个region都有一个记忆集用来记录跨代引用,每个记忆集都用哈希表实现,key是其他region区指向自己的指针,value是自身卡表的索引号,而每个卡表记录了从自身指向其他region区域的指针。G1的收集器记录了双向指针。相比之下cms的记忆集只记录了从老年代到新生代的单向指针(因为新生代有随生随灭的不稳定性)。对于维护方面cms和G1都使用了写后屏障来维护。

步骤:

初始标记:

同cms。

并发标记:

同cms,最后还要处理原始快照下的因用户线程变动的标记。

最终标记:

用于处理TAMS中的那一些数据,多线程并行的。

筛选回收:

通过设定指定的stw时间,对部分region区域回收,速度很快,单线程并行的。

用户线程运行对垃圾收集产生的影响:

并发标记阶段,对于该阶段,用户线程同时运行,对标记变量产生的影响,cms使用了增量更新算法,g1使用了原始快照算法(SATB),同时还需要写前屏障来记录发生变化的指针,开销相对于cms比更大,cms可以同步的运行增量更新算法,G1只能把原始快照算法和写前屏障放入消息队列中异步的运行。用户线程运行阶段新产生的对象,G1在region区域开辟了两个指针TAMS,新对象的地址就存在TAMS中,垃圾收集时默认对这两个指针地址上的区域不进行垃圾收集。

筛选回收阶段:

cms是标记清除法,G1是标记整理算法。

整体的stw时间设定:

若stw时间设定太短的话,每次只能回收一点region区域,当堆区垃圾收集的速度赶不上垃圾产生的速度就会堆溢出发生full gc,从而发生更大stw。

收集器的权衡

第一方面:

根据电脑的系统(windows,linux),根据电脑的核数,电脑内存等来判断。

第二方面:

根据jdk的版本来选择

第三方面:

根据需求来选择,吞吐量优先还是低延迟优先(小的stw)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值