GC Root分析

文章目录

  • GC Root分析
    • 解决问题
    • 适用场景
    • 组成部分
      • 定义
      • 可作为GC Root的对象
      • 示例

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
	}
}

你可能感兴趣的:(1_计算机,1.1_java,1.1.1_JVM)