判断对象是否存活的方法
- 引用计数法
- 可达性分析
一、引用计数法
在对象中添加一个引用计数器,每当有一个地方引用该对象,计数器就+1,当引用失效时,计数器-1
存在的问题
两个对象相互引用的时候可能无法被回收
二、可达性分析(JVM中使用的方法)
通过一系列被称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,说明此对象是不可用的
JVM中作为GC Roots的对象
- 虚拟机栈(栈帧中的局部变量表)中引用的对象:参数、局部变量、临时变量
- 方法区中类静态属性引用的对象:静态变量
- 方法区中常量引用的对象:字符串常量池里的引用等
- 本地方法栈中JIN引用的对象
- JVM的内部引用
- 所有被同步锁(synchronized)持有的对象
- JVM内部的JMXBean、JVMTI中注册的回调,本地代码缓存等
- JVM中实现的临时对象,跨代引用的对象
类回收的条件(必须全部满足)
- 该类所有的实力都已经被回收,堆中不存在该类的任何实例
- 加载该类的ClassLoader已经被回收
- 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法