Java 对象还活着么 (画画思维导图)
对象还活着吗
引用计数法
方法
对象被引用的时候+1,引用生效的时候-1,当计数器为 0 时达到回收条件
缺陷
对象互相引用时就无法达到回收条件
可达性分析
方法
从 GC Roots 出发往下找,在引用路径(引用链)上出现过的对象是可达的,反之则不可达,即可被回收
GC Roots 对象
栈帧中本地变量表中引用的对象
本地方法栈中 JNI 引用的对象
方法去中静态属性引用的对象
方法去中常量引用的对象
方法区回收
回收废弃常量(条件)
常量没有被任何地方引用
回收无用的类(条件)
该类所有实例都已经被回收
该类的 ClassLoader 已经被回收
该类的 Class 对象没有被引用,而且无法在任何地方通过反射访问该类的方法
引用(Reference)
强引用(StrongReference)
正常使用的类型,不需要显式定义,只要没有任何引用就可以回收
有哪些方法能达到强引用效果
基本引用类型
通过底层 API—这就是所谓的设置 Reachability Fence
软引用(SoftReference)
如果一个对象只剩下软引用,在 JVM 内存不足的时候会将这个对象进行回收
弱引用(WeakReference)
如果对象只剩下弱引用,那 GC 的时候就会回收
虚引用(PhantomReference)
比较特殊,任何时候都可能被回收,可用用来实现类似 Object.finalize 的功能
引用队列(ReferenceQueue)
Reachability Fence(可达性栅栏)
Why
根据规范,一个对象没有强引用,则符合垃圾回收的标准。但是!如果有的对象,没有强引用,但是部分属性还需要被使用,就会导致问题。Reachability Fence 就是通过一些方法,在没有强引用时,告知 JVM 这些对象正在被使用,先不要进行 GC。
如果有的对象,没有强引用,但是部分属性还需要被使用,就会导致问题
How
Reachability Fence 就是通过一些方法,在没有强引用时,告知 JVM 这些对象正在被使用,先不要进行 GC。
使用 Reference.reachabilityFence(this);
cleaner 机制
版权声明: 本文为 InfoQ 作者【Beldon.Wu】的原创文章。
原文链接:【http://xie.infoq.cn/article/ad5613caf5b76c3092e881011】。文章转载请联系作者。
评论