垃圾回收共有3种
1.一种是引用计数
引用计数就是每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。
引用计数的缺点是:
(1)不能解决循环引用
(2)会有并发的问题
但是不能解决循环引用问题,循环引用如右边橙色的图:
不能解决循环引用的原因是:
class TestA{ public TestB b; }
class TestB{ public TestA a; }
public class Main{
public static void main(String[] args)
{
A a = new A();//对象A的引用计数为1
B b = new B(); //对象B的引用计数为1
a.b=b; //对象B的引用计数为2
b.a=a; //对象A的引用计数为2
a = null; //对象A的引用计数为1
b = null; //对象B的引用计数为1
}
}
如上面这段代码,在a=null过程中,由于a的引用原本是2,不能回收a,该过程只是将a的引用变成1,没有对a.b进行收回,此时并没有递减b的引用; 经过b=null,b引用变成1。此时变成a引用数1,b引用数1。导致内存无法释放。
处理的方法:
(1).起一个线程全局循环遍历,找到没有被回收的就回收
(2).强弱指针,没看懂