什么是被 GC Roots 直接引用的对象?

CMS 垃圾回收器进行垃圾回收的时候会分成 4 个阶段:初始标记、并发标记、重新标记、并发清理。其中初始标记阶段会「Stop the world」,并且回收被 GC Roots 直接引用的对象,这个过程很短,对系统正常运行的影响很小。

这里所说的被 GC Roots 直接引用的对象是怎么样的对象呢?

我们看下面这样一段代码:

public class Order {
	public static User user = new User();
}

public class User {
	private Position position = new Position();
}

首先我们应该知道 GC Roots 是类的静态变量,或者方法的局部变量。在这里我们很容易看出,user 属于类的静态变量,而 User 对象是被 user 直接引用的对象,所以 User 是被 GC Roots 直接引用的对象。

position 是类的实例变量,它既不是类的静态变量也不是方法的局部变量,它不是 GC Roots,position 引用的 Position 对象就不是被 GC Roots 直接引用的对象。

![初始标记]( https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yNzkxMDc5LWUyOTU4MDM0NjVmZjZlZGMucG5n?x-oss-process=image/format ,png)

初始标记的过程如上图所示,被 GC Roots 直接引用的 User 对象将会被标记出来,被间接引用的 Position 对象还未被标记。

posted @ 2020-04-06 09:50  深页  阅读(442)  评论(0)    收藏  举报