引用计数法(已淘汰 )
每个对象有一个引用属性,新增一个引用就加一,引用释放就减一;计数为0就可以回收。
但是这种方式无法解决循环引用的问题,A引用B,同时B引用A。
可达性分析算法(根引用)
1.从GCroot开始向下搜索,搜索走过的路径称为引用链,如果这个对象到GCroot没有任何引用链相连时,证明对象不可用,可以回收。
2.GCroot包含哪些?
a.虚拟机栈中引用的对象
b.方法区中静态属性应用的对象
c.方法去中常量引用的对象
d.本地方法栈中引用的对象
不同的引用类型回收机制也是不一样的
1.强引用:new出来的对象都是强引用,不回收,哪怕OOM。String str = "abc"也是
2.软引用:当JVM对空间不足时,就会回收。通过java.lang.ref.SoftReference使用软引用
3.弱引用:在GC时就会回收。通过WeakReference来使用弱引用
4.虚引用:随时可以被回收,通过PhantomReference来使用虚引用。