1.根搜索算法
根搜索算法 是 JVM 虚拟机判断一个对象是否存活的算法。它把内存中的每一个对象看成一个节点,并定义了一些对象作为根节点(GC Roots)。
如果一个对象中有对另一个对象中的引用,那么就认为第一个对象有一条指向第二个对象的边。JVM会起一个线程从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。
2.哪些点可以被作为 GC Roots
2.1.Java 虚拟机栈中引用的对象
首先第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象,对象会在堆上开辟一块空间,同时会将这块空间的地址作为引用保存到虚拟机栈中,如果对象生命周期结束了,那么引用就会从虚拟机栈中出栈,因此如果在虚拟机栈中有引用,就说明这个对象还是有用的,这种情况是最常见的。
2.2.方法区中的静态成员
第二种是我们在类中定义了全局的静态的对象,也就是使用了static 关键字,由于虚拟机栈是线程私有的,所以这种对象的引用会保存在共有的方法区中,显然将方法区中的静态引用作为GC Roots是必须的。
2.3.方法区中的常量引用对象
第三种便是常量引用,就是使用了static final 关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也应该作为GC Roots。
2.4.本地方法区中的 JNI(Native 方法)引用的对象
最后一种是在使用 JNI 技术时,有时候单纯的 Java 代码并不能满足我们的需求,我们可能需要在 Java 中调用 C 或 C++ 的代码,因此会使用 native方法,JVM内存中专门有一块本地方法栈,用来保存这些对象的引用,所以本地方法栈中引用的对象也会被作为GC Roots。