GC Root分析
解决问题
-
问题
java语言自动执行垃圾回收,但什么是垃圾呢?简单来说就是内存中已经不在被使用到的空间就是垃圾,那么又如何判断一个对象是否可以被回收呢?这时,出现了引用计数法,但是这种方法难以解决循环引用问题,那么又如何解决这个问题呢?
-
解决
枚举根节点做可达性分析(跟搜索路径)
适用场景
复制算法,标记-清除算法,标记-压缩,都使用了可达性分析的方法
组成部分
所谓"GC roots"或者说tracing GC的"根集合",就是一组必须活跃的根集合
定义
根搜索算法是JVM用来的判断对象是否存活的算法,此算法基本思路为通过一系列的“GC Roots”对象作为起始点,从这些节点往下搜索,当一个对象和GC Roots不可达时,则该对象是无用的,可被回收的。
可作为GC Root的对象
- 虚拟机栈(栈帧中的局部变量区,也叫作局部变量表)中引用的对象.
- 方法区中的静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(Native方法)引用的对象(例如:线程中的start方法)
示例
package top.ygy.jvm;
/**
* @Description: TODO(GC Root示例)
* @author yangguangyuan
* @date 2019年6月27日
*
* 1 虚拟机栈(栈帧中的局部变量区,也叫作局部变量表)中引用的对象.
* 2 方法区中的静态属性引用的对象
* 3 方法区中常量引用的对象
* 4 本地方法栈中JNI(Native方法)引用的对象(例如:线程中的start方法)
*/
public class GCRootDemo {
private byte[] byteArray = new byte[1024 * 1024 * 1024];
// private static GCRootDemo2 t2; //第2种GC Root
// private static final GCRootDemo3 t3 = new GCRootDemo3(8);//第3种GC Root
private static void m1() {
GCRootDemo t1 = new GCRootDemo();
System.gc();
System.out.println("第一次gc完成");
}
public static void main(String[] args) {
m1();//第1种GC Root
}
}