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回收,可是這是爲何?java
將代碼跑起來,並將堆dump下來,藉助MAT分析。
在Histogram視圖找到Team實例:
code
而後 右鍵找到的Team對象-> List Objects -> With incoming references
對象
而後 右鍵找到的Team對象-> Path TO GC Roots -> exclude All Phantom...
ssl
不難看出,靜態字段不是GC ROOT,GC ROOT是Thread...
Thread持有contextClassLoader,Classloader再持有靜態字段...it
同時MAT還提供了直接查看GC ROOT的功能,咱們也能夠順着GC ROOT往下找到咱們的對象。
class