假設我有一個名為“master”的對象,它分別擁有 100 個名為“slave0”到“slave99”的對象。(這不是一個數組。我的“主”類中有 100 個字段,分別稱為 salve0 到 slave99。)現在,假設我的程序首先讀入一個包含“主”對象的序列化存儲版本的文件。但是,假設我的程序從不使用對象 slave50 到 slave99。會發生什么?(我的猜測是,作為讀取/反序列化過程的一部分,java 程序將首先讀取所有 100 個從屬對象,并且只有在讀入所有 100 個從屬對象后,它可能會選擇執行 GC,此時對象 slave50 到 slave99 將被 GC 刪除并回收內存。這是正確的嗎?注意:對象“master”仍在使用中,因此從技術上講,對象 slave50 到 slave99 仍在被父對象 master 引用,并且父對象 master 仍在積極使用中。)后續問題因此,假設我上面關于 GC 工作原理的猜測是正確的;如果我的長時間運行的程序花了幾分鐘時間處理對象 slave0 到 slave50,然后進入另一個名為“X”的最終(長時間運行)過程,該過程只處理對象 slave0 到 slave25。GC 會不會意識到即使對象 slave25 到 slave50 仍然被父對象 master 引用,并且即使對象 master 仍在使用,GC 仍然足夠聰明以擺脫對象 slave25 到 slave50,因為沒有人是否會從“程序 X”開始使用它?
2 回答

慕少森
TA貢獻2019條經驗 獲得超9個贊
在 Java 中,GC 不會刪除活動對象。在查看跟蹤 GC 邏輯時,當一個對象可從活動線程訪問時,它被認為是活動的(除非我們正在考慮更奇特的引用類型,例如WeakReference
)。在您的簡單示例中,master
對象中的所有字段都是可訪問的,因為master
對象本身可從main
線程訪問。
添加回答
舉報
0/150
提交
取消