标记阶段
判断对象是否可回收方法:
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<Object>(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回收过程:
网友评论