示例代码
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实例:
然后 右键找到的Team对象-> List Objects -> With incoming references
然后 右键找到的Team对象-> Path TO GC Roots -> exclude All Phantom…
不难看出,静态字段不是GC ROOT,GC ROOT是Thread…
Thread持有contextClassLoader,Classloader再持有静态字段…
同时MAT还提供了直接查看GC ROOT的功能,我们也可以顺着GC ROOT往下找到我们的对象。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!