3个问题:

1.如何判断对象为垃圾对象

  a.引用计数法

    在对象中添加一个引用计数器,当有地方引用这个对象的时候,引用计数器的值就+1,

    当引用失败(例如,对象置为null),引用计数器的值就-1

  b.可达性算法(推荐)

    从GCroot根节点往下搜索,能走到就不是垃圾对象,走不到就是对象

2.如何回收

  a.回收策略

    标记-清除算法

        把判定为垃圾对象做一个标记,进行清除

        但是,有两个问题

        1.效率问题

        2.空间问题

    复制算法 

        主要解决了效率问题(新生代)

        在Eden创建对象(80%)——垃圾的回收最喜欢的地方

        Survivor(存活期)(20%)——垃圾回收后对象存活的地方

        Tenured  Gen

    标记-整理算法(老年代)

      先进行标记,把需要回收的和不需要的进行整理移动,中间分隔,把垃圾对象进行回收

    分代收集算法

      新生代——复制算法

      老年代——标记-整理算法

  b.垃圾回收器

    serial

        最基本,发展最悠久

        单线程

        桌面应用

    parnew

        复制算法

         多线程

    parallel

        复制算法

        多线程

        达到可控制的吞吐量

            吞吐量:(执行用户代码的时间)/(执行用户代码时间+垃圾回收所占用的时间)

        -xx:MaxGCPauseMillis 垃圾收集器停顿时间

        -xx:GCTimeRatio  吞吐量大小

    cms

      (不能与parllel一起使用)

      老年代

      标记-清除算法

      并发:两件事同时做

      并行:一件事几个人同时做

      初始标记

      并发标记

      重新标记

      并发清理

      优点:并发收集、低停顿

                      缺点:占用大量的cpu资源,无法处理浮动垃圾、出现Concurrent mode  Failure 、空间碎片

    G1

      优势:

        并行与并发

        分代收集(分区域)

        空间整合

        可预测的停顿

      步骤:

        初始标记

        并发标记

        最终标记

        筛选回收

3.何时回收

posted on 2019-05-11 09:49  <meng>  阅读(79)  评论(0编辑  收藏  举报