可达性分析算法Test
可达性分析算法相对于引用计数算法而言,可达性分析算法同样具备实现简单和执行高效等特点,更重要的是,该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生,这个算法目前较为常用。Java语言选择使用可达性分析算法判断对象是否存活。这种类型的垃圾收集通常叫作追踪性垃圾收集(Tracing GarbageCollection),它的基本流程如下。可达性分析算法是以GC Root(根对象)(见14.2.1节)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达。GC Root不止一个,它们构成了一个集合,称为“GC Roots”,所谓“GC Roots”集合就是一组必须活跃的引用。使用可达性分析算法后,内存中的存活对象都会被根对象集合直接或间接连接着,搜索所走过的路径称为引用链(ReferenceChain)。如果目标对象没有在引用链上,则表示对象是不可达的,就意味着该对象已经死亡,可以标记为垃圾对象。即在可达性分析算法中,只有引用链上的对象才是存活对象。
GC Roots集合
在Java语言中,GC Roots集合中的对象引用包括以下几种类型。虚拟机栈中对象的引用,比如,各个线程被调用的方法中使用到的引用数据类型的参数、局部变量等。本地方法栈内JNI(本地方法)对象的引用。方法区中引用数据类型的静态变量。方法区中常量对象的引用,比如字符串常量池(String Table)里的引用。所有被同步锁synchronized持有的对象引用。JVM内部的引用。基本数据类型对应的Class对象引用,一些常驻的异常对象引用(如NullPointerException、OutOfMemoryError),系统类加载器对象引用等。反映JVM内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存对象的引用等。