一、可达性分析算法
“GC Roots”根对象集作为起始点集合,从这些节点开始,根据引用关系向下搜索,搜索过程路径称为“引用链”。如果,某对象到GC Root没有引用链相关联,那么,就是GC Root到对象不可达,则证明这个对象不可能再被使用。
上图所示,Object 1与GC Root可达,而Object 5与GC Root不可达。
二、GC Roots有哪些
在Java技术体系里面,固定作为GC Root的对象:
-
- 虚拟机栈中引用的对象,如:线程中被调用的方法堆栈中使用的参数、局部变量、临时变量。
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象,比如:字符串常量池里的引用。
- 本地方法栈中JNI引用的对象。
- Java虚拟机内部的引用,比如:基本数据类型对应的Class对象、常驻异常对象、系统类加载器,如:String、NullPointExcepition等。
- 所有被同步锁持有的对象(synchronized关键字)。
- 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。