垃圾回收器以及各种垃圾收集算法

 

垃圾回收器分类

粗分法:

1)串行回收器

2)并行/吞吐量回收器

3)CMS回收器

4)G1回收器

 

细分法:

1)Serial:串行收集器

2)SerialOld:老年代的Serial版本

3)Parallel:并行收集器,是串行收集器的多线程版本,多CPU下

4)ParallelOld:老年代的Parallel版本

5)CMS:并发收集器

6)G1:面向服务器端应用的垃圾收集器,计划未来有可能会替代CMS收集器

 

这四种收集器的共同之处在于他们都是分代的,也就是说他们将托管的堆分成了好几个区域。

1.串行收集器

是最简单的一种。主要面向单线程环境以及比较小的堆。该回收器工作时回想所有应用线程全部冻结,因此使得它完全不可能会被服务器端应用所采用。

 

2.并行/吞吐量回收器

并行回收器Parallel是JVM默认的回收器。它的最大优点就是使用多个线程来扫描和压缩栈。它的缺点是就是不管执行的是minor GC还是FUll GC都会暂停应用线程。并行回收器最适合那些可以容许暂停的应用,它试图减少由回收器所引起的CPU开销。

 

3.CMS回收器

这个算法使用了多线程来扫描堆并标记那些不再使用的可以回收的对象。

这个算法在两种情况下会进入一个“stop the world”的模式:当进行跟对象的初始标记的时候(老年代中线程入口点或静态变量可达的那些对象)以及当这个算法在并发运行的时候应用程序改变了堆的状态使得它不得不回去再次确认自己标记的对象都是正确的。

与并行收集器相比它的缺点是:它使用的CPU资源会更多,它使用了多个线程来执行扫描和回收,这样才能让应用持续提供更高级别的吞吐量。

当堆的大小小于4G,而你希望分配更多的CPU资源以避免应用暂停,可以选择 CMS。

 

4. G1回收器

它的设计目标是更好地支持大于4GB的堆。

 

关于垃圾收集器的一些思考:

1)serial收集器是虚拟机运行在Client模式下的默认新生代收集器。它有着优于其他收集器的地方:简单高效。 

为什么高效?这里的高效是指:对于限定单个cpu环境来说,serial收集器由于没有线程交互的开销,可以获得最高的单线程收集效率

应用场景:用户桌面

2)CMS是并发收集、低停顿的收集器。在并发阶段,CMS不会导致用户线程停顿,但是会因为占用了一部分线程(cpu资源)而导致应用程序变慢,总吞吐率会降低。问:CMS垃圾收集器怎么解决这个问题的? 

就是在并发标记、清理的时候让GC线程、用户线程交替运行,尽量减少GC线程独占资源的时间,这样整个垃圾收集的过程会更长。但对用户程序的影响就会显得少一些,速度下降没有那么明显。

 

CMS是基于“标记-清除”算法实现的收集器,这意味着收集结束的时候可能会有大量空间碎片产生。空间碎片过多会给大对象分配带来麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象不得不提前触发一次 Full GC。 问:CMS是怎么解决这个问题的?

CMS提供了一个开关参数,用于在CMS收集器顶不住要进行Full GC时开启内存碎片的合并整理过程。还提供了另一个参数用于设置执行多少次不压缩的Full GC后,来一次带压缩的Full GC。

 

3)G1收集器。优点:并发并行,分代收集,空间整合,可预测停顿。

空间整合--与CMS的“标记-清理”算法不同,G1是基于“标记-整理”算法的。这种特性更有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

问:G1收集器是怎么做到可预测停顿?在G1之前的收集器进行收集的范围是整个新生代和老年代,而G1是将整个java堆分割成多个大小相等的独立区域,但还保留着新生代和老年代的概念。G1跟踪各个region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的region,这种收集方式保证了G1收集器在有限时间里可以获取尽可能高的收集效率。

 

垃圾回收器的选用决定因素:

1、应用程序的场景
2、硬件的制约
3、吞吐量的需求


串行垃圾回收是最简单的也是效率最低的,如果只是控制台的单线程程序简单任务,并且机器配置不高,推荐使用。

并行垃圾回收器是64bit server默认的垃圾回收器,一般我们工作和生产上默认不配置,都是并行垃圾回收。对于一般的不要求吞吐的应用,并且硬件资源不是太充足的情况下,并行垃圾回收器差不多能满足需求。


CMS垃圾回收器是对并行垃圾回收器的一个优化,它以CPU和系统资源为代价,换取GC的延迟。不会一GC就STW,而是根据情况STW。一定程度上是资源换取速度。


G1垃圾回收器是针对于大heap的垃圾回收器,如果heap分配的足够大,分的region的优先级回收策略会优先清理垃圾多的region.并且减少了内存空间碎片,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

 

垃圾回收算法:

标记-清理算法:此算法分两个阶段,第一个阶段从引用根节点开始标记所有被引用对象。第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用。同时,会产生内存碎片

标记-整理算法:此算法分两个阶段,第一阶段从引用根节点开始标记所有被引用对象。第二阶段,遍历整个堆,把未被标记的对象清除,并把存活的对象“压缩”到堆的其中一块,安顺序排放。此算法避免了标记-清理算法的内存碎片问题,同时也避免了复制算法的空间问题。

复制算法:它是将可用内存划分为两块可用的大小相同的区域,每次只使用其中一块,当这快内存用完了,将存活的对象复制到另一块中,然后再把已使用过的内存空间一次清理掉,这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等问题,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。

 

内存分配与回收策略:

内存分配默认是堆分配。

未完待续。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值