我们都知道c++程序在创建对象时需要构造函数为对象开辟空间,该对象不再使用时需要手动写析构函数释放空间。但Java因为实现了垃圾回收机制,程序员不需要手动的去释放对象空间。
不同的厂商采用不同的算法实现GC
引用计数算法
引用计数算法是为每个对象一个计数器用来保存对象被引用的次数,如果该对象被其他对象引用,计数器加1,对该对象引用结束则计数器减1,当计数器为0时认为该对象已经没有任何引用,就会被回收。
String str = new String("gc");
str = null;
如图,当str设置为null时,gc的引用次数为0,将被回收
但引用计数法会出现循环依赖问题
public class MyClass {
public Object instance;
}
MyClass c1 = new MyClass();
MyClass c2 = new MyClass();
c1.instance = c2;
c2.instance = c1;
c1 = null;
c2 = null;
此时两个instance互相引用,计数器一直为1,GC永远无法回收它们。