1.根搜索算法
Java使用根搜索算法回收垃圾,该算法的基本原理:定义一系列名为GC Roots的对象作为起点,从起点向下搜索,搜索所走过的路径称为引用链。
当一个对象到GC Roots没有任何引用链相连,则说明该对象不可用,这时Java虚拟机可以对这些对象进行回收。
Java虚拟机将以下对象定义为 GC Roots :
- Java虚拟机栈中引用的对象:比如方法里面定义这种局部变量 User user= new User();
- 静态属性引用的对象:比如 private static User user = new User();
- 常量引用的对象:比如 private static final User user = new User();
- 本地方法栈中引用的对象
2.引用的定义
2.1 强引用Strong Reference
Object obj = new Object();
这里obj 就是引用,new Object() 对象实例存储在堆内存,obj引用的是对象实例的内存地址。
如果执行 obj = null, 那么看起来 new Object() 这个对象实例没有被任何引用持有。
由此看来:引用要么存在,要么不存在。如果没有任何引用持有对象,那么对象可以被JVM回收了。
但有一些缓存系统,希望这些对象不要那么快被回收,因此在JDK1.2之后又定义了另外3种引用类型。
2.2 软引用 Soft Reference
用来描述可用