静态字段引用的对象为什么不会被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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM