对象回收的判断算法
1、引用计数算法
给对象添加一个引用计数器,每一个地方引用它,计数器值就加1,对象引用失效的时候,计数器就减1。当计数器值为0的时候,此对象为垃圾。
优点: 判定效率高
缺点: 对象间循环依赖,此算法无法正确判断是否为垃圾对象(致命),主流虚拟机没有这种算法。
2、可达性分析算法
GC Roots的对象作为起始点,从这些结点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain)当一个对象到GC Root没有任何引用链相连时,则证明此对象是不可达的。
可以作为GC Roots的对象
- 栈帧中本地变量表中引用的对象
- 方法区类静态属性引用的对象
- 方法区中常量引用的对象
- 方法栈JNI引用的对象
方法区回收
方法区回收内容为废弃常量
、无用类
无用类包含:
- 该类所有实例都被回收
- 加载该类的ClassLoader被回收
- 该类对应的class对象没有引用,无法在任何地方反射访问该类方法
垃圾收集器算法
1、标记清除算法(最基础算法)
- 首先标记出所有需要回收的对象。
- 在标记完成后统一回收掉所有被标记的对象
缺点:1、标记和清除过程的效率都不高。2、产生大量的不连续内存碎片
2、复制算法
- 内存按容量划分成大小相等的两块
- 一块内存用完了,将存活着的对象复制到另外一块
- 将都是垃圾对象的那块清空内存
缺点:1、在对象存活率较高时,复制操作次数多,效率降低。2、内存缩小了一般;需要额外空间做分配担保。
3、标记整理算法
- 标记步骤和清除算法相同
- 标记完后垃圾对象移动到一段,然后再清理掉
4、分代收集算法
- 复制算法 新生代
- 标记-清理或者标记-整理 老年代
垃圾收集器
- Serial(最基本的收集器)
- 单线程
- 垃圾收集的时候 ,暂停所有线程
- 优点简单高效,缺点停顿时间长
- 年轻代-复制算法,老年代-标记整理算法
- ParNew收集器 Serial的多线程版本
- Parallel Scavenge收集器
- 新生代收集器
- 复制算法
- 吞吐量较高
- 多线程
- Serial Old收集器 Serial的老年代版本
- Parallel Old收集器 Parallel的老年代版本
- CMS收集器
- 回收停顿时间短
- 多线程
- 标记-清除
- 1.初始标记 STW
- 2.并发标记
- 3.重新标记 STW
- 4.并发删除
- G1收集器
- 并发执行
- 分代收集
- 空间整合
- 可预测停顿