前面描述了JVM的内存区域,知道了GC主要发生在堆,那么GC该怎么判断堆中的对象实例或数据是不是垃圾呢,或者说判断某些数据是否是垃圾的方法有哪些。
1.引用计数法
最容易想到的一种方式是引用计数法,啥叫引用计数法,简单地说,就是对象被引用一次,在它的对象头上加一次引用次数,如果没有被引用(引用次数为0),则此对象可回收
String ref = new String ("Java");
以上代码ref 引用了右侧定义的对象,所以引用次数是1:
如果在上述代码后面添加一个ref = null,则由于对象没被引用,引用次数置为0,由于不被任何变量引用,此时即被回收,如下图所示:
看起来用引用计数确实没啥问题了,不过它无法解决一个主要的问题:循环引用
public class Te