静态字段引用的对象为什么不会被GC回收

示例代码

import java.util.ArrayList;
import java.util.List;

public class StaticFieldClass {
	
	public static List<Team> staticField1 = new ArrayList<Team>();
	
	static {
		staticField1.add(new Team());
		staticField1.add(new Team());
	}
}

staticField1 字段引用Team的对象,Team对象肯定不会被GC回收,但是这是为什么?

静态字段是不是GC ROOT,如果不是那是谁

将代码跑起来,并将堆dump下来,借助MAT分析。
在Histogram视图找到Team实例:
步骤1

然后 右键找到的Team对象-> List Objects -> With incoming references
步骤2

然后 右键找到的Team对象-> Path TO GC Roots -> exclude All Phantom...
步骤3

gc root path

不难看出,静态字段不是GC ROOT,GC ROOT是Thread...
Thread持有contextClassLoader,Classloader再持有静态字段...

同时MAT还提供了直接查看GC ROOT的功能,我们也可以顺着GC ROOT往下找到我们的对象。 步骤4
步骤5

猜你喜欢

转载自www.cnblogs.com/simoncook/p/11200123.html