对象已死指不可能再被任何途径使用的对象。
垃圾收集器主要关注3个问题:哪些内存需要回收?什么时候回收?如何回收?本篇就是对第一个问题的回答。
一、回收的区域
程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,内存多少根据类结构是已知的,内存分配和回收具备确定性。
Java堆和方法区两个区域不确定性。只有处于运行期间,我们才能知道程序究竟会创建哪些对象,多少个对象,这部分内存的分配和回收是动态的。垃圾收集器所关注的正是这部分内存该如何管理。
二、判断对象已死的算法
2.1 引用计数算法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器就减一;任何时刻计数器为零的对象就是不可能再被使用的。
原理简单,判断效率也很高。但需要配合大量额外的处理才能保证工作,比如无法解决对象之间相互循环引用的问题。 比如:对象A和对象B都有字段instance,赋值令A.instance=B, B.instance=A,除此之外,再出引用,但它们互相引用着,计数不为零,如果用引用计数算法,则无法回收。
2.2 可达性分析算法
通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,则