Java堆上存放着几乎所有对象实例,垃圾回收器在对堆进行垃圾回收前需要判断哪些对象还存活?哪些对象已经“死去”(不再被引用)?
除了可达性分析算法外还有引用计数法。
引用计数法
例:
A对象引用了B对象,给B对象的计数器+1
C对象也引用了B对象,给B对象的计数器再+1
当引用失效时,计数器-1
任何时刻计数器为0的对象就是不能再被使用的,即对象已“死”,才可以被回收。
这就是引用计数法
虽然引用计数法实现简单,判断效率也高,但JVM中没有选用引用计数法来管理内存,主要是因为引用计数法无法解决对象的循环引用问题。
A和B的计数器都是1,不能被回收。
Python语言采用的就是引用计数法来进行内存管理。
可达性分析算法
JVM采用的是“可达性分析”来判断对象是否存活。
object5、object6、object7之所以被回收,是因为它们不能到达GC Roots(不可达),所以已“死”,被回收。
在Java中,可以作为GC Roots的对象有以下几种: