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