靜態字段引用的對象為什么不會被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