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

慕少森
TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
在 Java 中,GC 不會(huì)刪除活動(dòng)對(duì)象。在查看跟蹤 GC 邏輯時(shí),當(dāng)一個(gè)對(duì)象可從活動(dòng)線(xiàn)程訪(fǎng)問(wèn)時(shí),它被認(rèn)為是活動(dòng)的(除非我們正在考慮更奇特的引用類(lèi)型,例如WeakReference
)。在您的簡(jiǎn)單示例中,master
對(duì)象中的所有字段都是可訪(fǎng)問(wèn)的,因?yàn)?code>master對(duì)象本身可從main
線(xiàn)程訪(fǎng)問(wèn)。
添加回答
舉報(bào)
0/150
提交
取消