虚拟机回收小结

java区别去C、C++最大的特点就是垃圾回收

垃圾回收主要要点:

1、回收算法(回收哪些对象)

2、回收器(怎么回收)

查找垃圾对象

  1、引用计数

    每个对象都包含一个引用计数器,表示该对象被引用的次数,如果为0,则表示为游离对象,可以被回收;

    不能解决环形引用。

  2、根搜索

    根据一批根对象搜索引用的所有对象、以及整个引用链上的对象,未在引用链上的对象就是垃圾对象。

回收算法

    标记-回收:标记根对象(一批)能到达的对象,回收剩下的对象。(简单、磁盘碎片多)

    标记-复制:同标记-回收的标记一样,将堆划分为两块区域,当需要回收时,会将存活的对象拷贝到新的区域,然后回收所有旧的区域。(回收效率高、空间浪费)

    标记-整理:同标记-回收大致一样,只是在回收前会将存活的对象移动到内存的一端,然后回收剩下的垃圾数据。(节约空间、回收效率高)

回收器

  A、串行

    Serial(复制)、Serial-Old(标记-整理)

    默认client模式会使用,stop the world

  B、并发

    ParNew 是 Serial的多线程版本

    Parallel Scanvenge(复制算法)  和  Parallel Old

    Concurrent Mark Sweep:基于标记-清除算法、低停顿(3次标记(2次 stop the world)、清除);CPU敏感、浮动垃圾无法处理、内存碎片需要FULL GC来帮助清理。

  C、G1 Garbage First 低停顿、高吞吐。会stop the world

    将内存换分为新生代、老年代后,在切分成不同的块(Region)

    新生代会暂停所有应用,然后将对象拷贝到存活区或者老年代,老年代也是通过拷贝的方式来完成清理,能有效的控制磁盘碎片。

    当磁盘空间不足时会降级到Serial回收方式。

    Humongous区,为大对象分配区域,一般为连续的内存块。

    新生代和老年代引用问题:CMS 通过 point out,通过一块内存记录所有老年代指向新生代的对象应用;G1已经分片切块,不需要记录所有的老年代引用,所以提出了point in 概念,只存取老年代到新生代某块的引用,可以降低扫描整个老年代的问题。

    G1 的mix GC 算法也是:标记-拷贝,在标记时同CMS一样也会Stop the world,清理阶段也会Stop the world。

    G1 新提出了三色标记算法:

      黑色:根对象或它的子对象已经被扫描

      灰色:本身被扫描、还没扫描完该对象的子对象

      白色:未被扫描的对象或垃圾对象

    

posted @ 2018-06-05 12:10  lion_eagle  阅读(303)  评论(0编辑  收藏  举报