引用
- 狭义引用
- 地址
- 扩充引用
- 强引用 Strong Reference
- Object obj = new Object()
- 软引用 Soft Reference
- SoftReference,将要发生内存溢出才会回收
- 弱引用 Weak Reference
- WeakReference,不影响回收,可做回收通知
- 虚引用 Phantom Reference
- PhantomReference,不影响回收,可做回收通知
- 强引用 Strong Reference
对象判活
- 引用计数法
- 无法解决循环引用
- 可达性分析
- GC Roots
- 虚拟机栈中引用
- 类静态属性引用
- 方法区常量引用
- 本地方法栈中JNI引用
- 对象状态
- GC Roots可达
- GC Roots不可达但需执行finalize
- 不可达也不需执行finalize
- 执行finalize
- 进入F-Queue,由虚拟机建立的低优先级Finalizer线来执行,此执行表示触发,但不保证执行结束
- 若finalize方法卡死,会被咔嚓掉
- finalize方法中可进行一次自救,但只能救一次
- finalize方法据说是在初期对应C/C++的析构函数而做的一次折中,实际并不提倡使用,而用try-finally更好
- 枚举根节点
- 必须Stop The World,所以对效率很敏感,全局扫描是不现实的
- 得益于准确式GC,虚拟机知道某个地址存的是什么类型数据,以此建立OopMap(Ordinary Object Pointer)
- 虚拟机没有为每条指令都建立OopMap,因为成本太高
- 所以有了Safe Point的概念,“可长时间执行”的地方,会建立OopMap,即安全点
- 可长时间执行一般指指令序列复用,即方法调用,循环跳转,异常跳转
- 有安全点后,需要考虑怎么让线程都停在安全点
- 抢先式中断(Preemptive Suspension)
- 发生GC时虚拟机停止所有线程,恢复没有跑到安全点的线程,等其安全,几乎不用
- 主动式中断(Voluntary Suspension)
- 生成一个test轮询指令,在安全点处执行,看是否有中断标识存在,若存在就停下自己
- 具体方案是虚拟机将一个内存页设为不可读,test读
- GC Roots