1.引用计数算法
概念:给对象添加引用计数器,有引用加1,失效减1。
问题:很难解决对象之间相互引用。
2.可达性分析算法
概念:GC Root 作为起点,搜索节点路径为引用链,没有引用链不可达,可回收。
GCRoot:
1.虚拟机栈(本地变量表)引用的对象。
2.方法区里静态属性引用的对象。
3.方法区里常量引用的对象。
4.J本地方法栈JNI引用的对象。
3.引用类型
a.强引用:普通的 Object o =ne Object() ,就是强引用,引用存在,对象就不会回收。
b.软引用(SoftReference):当内存不足,把这些对象回收,如果内存还不够,OutOfMemory.
c.弱引用:对象只能生存到下一次GC,不管内存是否充足。
d.虚引用:无法获得引用的实例,唯一目的,在垃圾回收的时候获得通知。
4.对象回收
对象自救:对象回收之前两次标记:
第一次:GC Root 不可达,而且经过第一次筛选,标记一次,筛选条件(finalize()方法是否有必要执行):finalize()方法没有覆盖,或者已经执行过,没必要。
第二次:F-Queue ,FinaLizer线程执行,在finalize()方法里和引用链上对象发生关联。
注意:一个对象finalize()方法只会执行一次,只能自救一次。
5.方法区回收 (永久代)
回收内容:废弃常量,无用类
回收条件:
a.无用类:
堆中没有类的实例;加载该类classLoader被回收;该类Class对象没有被引用。
b.常量:没有其他地方引用该常量。
3.3垃圾回收算法
1.标记-清除算法
2.复制算法
3.标记-整理算法
4.分代收集
4.HotSpot算法实现
1.枚举跟节点 GC节点 oopMap
2.安全点 safePoint
方法调用,循环跳转,异常跳转
抢先式中断,主动式中断
3.安全区域
3.5 垃圾收集器
http://www.jianshu.com/p/50d5c88b272d
1.serial 收集器
单cpu,单线程,“stop the world”
2. ParNew 收集器
并行收集,“stop the world”
3,parallel scavenge 收集器(吞吐量收集器)
并行收集,
特点:
关注点:吞吐量= 运行用户代码时间/cpu 总时间;
GC自适应的调节策略:
4. serial old 收集器
serial old 是serial 老年代版本;单线程。
应用场景:
Client模式
Serial Old收集器的主要意义也是在于给Client模式下的虚拟机使用。
Server模式
如果在Server模式下,那么它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。
5.parallel old
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。
在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。
6.CMS收集器
获取最短回收时间为目的收集器,互联网服务端。
初始化标记,重新标记两个过程需要 “ stop the world ” 。
初始标记(CMS initial mark)
初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop The World”。
并发标记(CMS concurrent mark)
并发标记阶段就是进行GC Roots Tracing的过程。
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
缺点:
CMS收集器对CPU资源非常敏感
CMS收集器无法处理浮动垃圾
CMS收集器会产生大量空间碎片
7.G1收集器
特点:
并行与并发
分代收集
空间整合
空间整合
执行过程:
初始标记(Initial Marking)
初始标记阶段仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS(Next Top at Mark Start)的值,让下一阶段用户程序并发运行时,能在正确可用的Region中创建新对象,这阶段需要停顿线程,但耗时很短。
并发标记(Concurrent Marking)
并发标记阶段是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行。
最终标记(Final Marking)
最终标记阶段是为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remembered Set Logs里面,最终标记阶段需要把Remembered SetLogs的数据合并到Remembered Set中,这阶段需要停顿线程,但是可并行执行。
筛选回收(Live Data Counting and Evacuation)
筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,这个阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。