第③章 垃圾收集器与内存分配策略2

上一篇博客中对于垃圾收集的一些算法做了简单的介绍,那么这篇博客就主要说一下虚拟机的具体垃圾回收器都有哪些,分别是收集那些区域的,怎么搭配的,使用的哪些算法,有哪些优缺点。

 

在开始介绍垃圾收集器之前说几点概念。

一.基本概念

1.枚举根节点,虚拟机不需要遍历整个方法区和与执行上下文去寻找GC ROOTS,而是在OopMap的这个数据结构中存储的就是对象的引用关系。直接通过这个数据结构可以快速的枚举出GC  ROOTS。

2.安全点:就是在GC进行枚举根节点的时候,需要保证引用之间的关系是稳定的,不在变化的,不然的话就会出问题,而安全点就是一个代码中的对象关系处于稳定状态的一个状态标记点。在GC进行的过程中,让所有的线程都跑到安全点在停顿下来,然后去执行GC过程。这里的让线程停顿有两种方式,1.抢先式中断和主动式中断。

什么是抢先式中断和主动式中断?

答:抢先式中断不需要线程的执行代码主动的去配合,在GC发生的时候,首先把所有的线程全部中断,如果发现有些线程中断的地方不在安全点上,就恢复线程让他跑到安全点上面在。这就是抢先式中断,但是现在几乎没有虚拟机的实现采用抢先式中断的方式暂停线程从而响应GC时间.

      主动中断的思想就是当GC需要中断线程的时候,不直接对线程进行操作,仅仅简单的设置一个标志,各个线程执行时会主动的轮询这个标志,发现中断标志位真时就自己中断挂起,轮训标志的地方和安全点是重合的。

 

上述出了安全点,还有安全区域的概念,这个我暂时也没有搞的很清楚,后期在补充吧,下面在介绍虚拟机中的一些垃圾回收器。

正式开始进入垃圾回收器的讲解。

二.垃圾回收器

     Java虚拟机规范中对垃圾收集器应该如何实现没有明确的任何规定,所以不同的厂商,不同版本之间虚拟机之间的垃圾回收器都可能会有很大的差别,并且一般的都会提供参数供用户根据需要自己组合出各个年代的收集器。这里主要讨论的是JDK1.7的虚拟机.

上图展示了7中作用于不同分代的收集器,如果两个收集器之间存在连线,就说明他们可以搭配使用。虚拟机所处的位置,则表示他们是属于新生代还是老年代的的收集器。下面就来逐个简答的介绍一下吧。

1.Serial收集器

  • 特点:是最基本、发展历史最悠久的收集器。这是一个单线程收集器。但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束
  • 应用年代:新生代
  • 采用算法:复制算法
  • 应用:是虚拟机运行在Client模式下的默认新生代收集器。
  • 优势:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程效率。
  • 缺点:Stop the world!

2.ParNew

  • 特点:ParNew收集器其实就是Serial收集器的多线程版本
  • 应用年代:新生代
  • 采用算法:复制算法
  • 应用:CPU较多,许多的Server模式下的虚拟机首选新生代的收集器.
  • 优势:除了Serial收集器外,目前只有它能与CMS收集器配合工作
  • 缺点:在单CPU环境,表现甚至不如Serial

3.Parallel Scavenge

  • 特点:Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。(吞吐量 = 运行用户代码时间 + 垃圾收集时间)。他的关注点是达到一个可控制的吞吐量。还可以根据当前系统的运行情况收集性能监测信息,动态调整这些参数以提供最合适的停顿时间或者最大吞吐量。
  • 应用年代:新生代,适合在后台运算而不需要太多交互任务的情况。(意味着CPU使用率很高,不停执行用户线程)
  • 采用算法:复制算法
  • 优势:同特点

怎么理解关注点是吞吐量而不是用户线程停顿时间呢?因为如果要用户线程停顿时间短,则是要牺牲吞吐量来实现的,即CUP更多的去执行垃圾回收线程,从而很快的进行回收,但是用户线程执行时间减少,即吞吐量下降。

他有很多的可配置参数,比如-XX MaxGCPauseMillis(GC最大花费时间),-XX GCTimeRatio(吞吐量大小)等等一系列参数。他可以设置成自动调整的参数。即GC的自适应调节策略

 

4.Serial Old收集器

  • 特点:Serial 的老年版本
  • 应用年代:老年代
  • 采用算法:标记-整理
  • 应用:与Parallel Scavenge收集器搭配使用;作为CMS收集器的后备预案,在并发收集发生Conurrent Mode Failure 使用。
  • 优势:主要的意义也是给Clinet下的老年代使用。

5.Parallel Old

  • 特点:Parallel Old是Parallel Scavenge收集器的老年代版本
  • 应用年代:老年代
  • 采用算法:标记-整理
  • 应用:注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel。

6.CMS收集器(重点)

  • 特点:是HotSpot虚拟机中第一款真正意义上的并发收集器,以获取最短回收停顿时间为目标的收集器。它第一次实现了让垃圾收集线程与用户线程同时工作,。
  • 应用年代:老年代
  • 采用算法:标记-清除
  • 应用场景:大部分集中在互联网站或者B/S系统的服务端上的 Java 应用
  • 优势:停顿时间短。

CMS和G1收集器后面详细研究,现在状态不佳,无法深入学习。。

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值