深入JVM 可达性分析与引用分类
主流的程序设计语言(Java C#等)在确定回收对象的主流实现中,是通过 可达性分析(Reachability Analysis) 来判断对象是否存活。
该算法的基本思路是通过一系列 GC Roots 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Referance chain),当一个对象到GC Roots没有任何引用链(即GC Roots 到这些对象不可达) 则证明此对象不可用
在Java语言中 GC Roots的对象包括以下几种
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量池引用的对象
- 本地方法栈引用的对象
从图可知 object1 object2 object3 均是GC Roots可达的 而object4 object5不可达 将被GC回收器 回收
关于引用:无论是通过引用计数法判断对象引用数量,还是通过可达性分析判断对象的引用链是否可达,判断对象是否存活都与引用有关。
JDK1.2之后,Java对引用概念进行拓展,主要将引用分为4类
——强引用(Strong Reference)是指代码中普遍存在的类别,如 Object obj=new Object() 这类的引用,只要强引用还在,那么堆中对象就不会被GC回收
——软引用 用于描述一些还有用但非必须的对象,如果系统将要发生内存溢出风险,那么这些对象会被放入回收行列
——弱引用 也是用于描述非必要对象的,强度更弱一点 被弱引用关联的对象只能生产到下一次GC发生之前
——虚引用 最弱的引用关系,一个对象是否有虚引用存在,不会对其生产时间有影响。为一个对象设置虚引用关联的唯一目的是能在对象被垃圾回收时发出一个系统通知