在熟悉Java内存区域[1]文中,指出了JVM运行时数据区有堆、方法区、虚拟机栈、本地方法栈和程序计数器5个部分,后3个部分都是线程私有的,其中的数据会跟随线程死亡自动回收,所以不需要垃圾收集。而堆和方法区是线程共享的,故垃圾收集主要关注这2个部分。
定义
给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器值为0的对象就是不可能再被使用的,也就是垃圾。
优点:实现简单,判断效率高
缺点:如果对象间出现循环引用,则无法准确判断垃圾
定义
定义一些
GC Roots
的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots
没有任何引用链相连,则证明此对象时不可用的。
RC Roots对象
Java采用的是可达性分析算法。
在JDK1.2之后,Java对引用的概念进行了扩充。强软弱虚,引用强度一次递减。