垃圾回收

标记阶段

判断对象是否可回收方法:

   1.引用计数法,问题:循环引用

   2.可达性分析法;

        不可达的对象一定会被回收吗?不一定,如下

回收过程的两次标记:

1.第一次标记:GC Roots到该对象没有引用链。

2.第二次标记:如果对象重写finalize()方法,则被加入到队列,由优先级较低的线程执行finalize(),如果执行发现与引用链建立联系,则该对象被移除“即将回收”集合。finalize()只可能调用一次。

GC roots包含以下几类元素:

1.虚拟机栈上引用的对象;

2.本地方法栈上引用的对象;

3.方法区中类静态属性引用的对象;如静态变量

4.方法区中常量引用的对象;如常量池的引用

5.被同步锁(sychnorized)住的对象;

清除阶段

垃圾收集算法:标记-清除算法,复制算法,标记-压缩(标记-整理)算法;

新生代:复制算法

老年代:标记压缩算法

增量收集算法:每次收集一小片区域,和用户线程交替执行,多次收集

分区算法:将整个堆分成多个小区域,每一个小区域独立使用、独立回收。如G1


并发:多个线程在某一时间段内同时发生

并行:多个线程在任一时间点内同时发生

引用

强引用:只要引用关系存在,就不会回收 Object object = new Object();

弱引用:引用关系虽然存在,但会在内存空间不够时被回收 

    SoftReference sr = new SoftReference(new Object());

    Object = sr.get();

软引用:引用关心虽然存在,但会在下次回收时候被回收

    WeakReference WeakHashMap

虚应用:一个对象是否有虚引用,对其生存周期没有任何影响,也无法通过虚引用获得对象实例,虚引用的目的是在回收时,收到系统通知


垃圾收集器

串行回收器:Serial,Serial Old

并行回收器:ParNew,Parallel Scavenge,Parallel Old

并发回收器:CMS,G1

回收器组合关系

Serial回收器:jdk1.3之前回收新生代唯一选择,单线程采用复制算法串行回收,stw,

Serial Old回收器:老年代版本,单线程采用标记整理算法,串行回收,stw

ParNew回收器:Serial的多线程版本

CMS:低延迟,第一款并发回收器,标记清除算法,会产生内存碎片,对cpu资源敏感,无法清理浮动垃圾(并发标记过程产生的垃圾)

    初始标记 stw

    并发标记

    重新标记 stw

    并发清理

    重置线程

Parallel Scavenge:吞吐量优先,自适应调节吞吐策略,复制算法,并行回收,stw,适合后台运算而不需要交互,如批量处理、订单处理、工资支付等

Parallel Old:是Parallel Scavenge的老年代版本

G1回收器

G1:面向服务单,适用多核CPU、大内存的机器,满足低延迟同时兼顾吞吐量

    并发、并行

    分区收集:同时兼顾年轻代、老年代

    空间整合:复制+标记整理算法

    可预测的停顿时间模型:可指定回收区域,缩小回收范围,

   缺点:额外的内存占用,及更高的负载 

G1回收过程:

垃圾收集器总结

你可能感兴趣的:(垃圾回收)