靜態字段引用的對象爲何不會被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回收,可是這是爲何?java

靜態字段是否是GC ROOT,若是不是那是誰

將代碼跑起來,並將堆dump下來,藉助MAT分析。
在Histogram視圖找到Team實例:
步驟1code

而後 右鍵找到的Team對象-> List Objects -> With incoming references
步驟2對象

而後 右鍵找到的Team對象-> Path TO GC Roots -> exclude All Phantom...
步驟3ssl

gc root path

不難看出,靜態字段不是GC ROOT,GC ROOT是Thread...
Thread持有contextClassLoader,Classloader再持有靜態字段...it

同時MAT還提供了直接查看GC ROOT的功能,咱們也能夠順着GC ROOT往下找到咱們的對象。
步驟4
步驟5class

相關文章
相關標籤/搜索