3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
垃圾收集器是一個(gè)“任務(wù)”,它定期掃描您的對象以檢測未使用的對象(實(shí)際上它是一種模擬具有無限內(nèi)存的機(jī)器的機(jī)制)。
出于這個(gè)原因,當(dāng)您持有對不再需要的對象實(shí)例的引用時(shí),您必須將其設(shè)置為null以便讓垃圾收集器知道您不再對該實(shí)例(可能還有它的后代)感興趣。
這并不意味著您必須null在使用后設(shè)置每個(gè)變量,但您必須注意字段。由于 Java 沒有處置模式(有關(guān)更多信息,請參見此處),您必須設(shè)計(jì) API 來模仿它:當(dāng)您使用完包含要釋放的引用的對象實(shí)例時(shí),您必須添加適當(dāng)?shù)姆椒▓?zhí)行此類操作。
考慮以下示例:
class MyClass1
{
int Field1;
int Field2;
int Field3;
int Field4;
}
class MyClass2
{
private MyClass1 m_MyReference;
public MyClass2()
{
m_MyReference = new MyClass1();
}
public void DoSomething()
{
// do something here that uses m_MyReference.
}
}
如果 MyClass2 的一個(gè)實(shí)例被保留,但程序的其他一些可訪問實(shí)例(例如,單例或當(dāng)前在堆棧中的某個(gè)實(shí)例),您將永遠(yuǎn)不會釋放與 MyClass1 關(guān)聯(lián)的內(nèi)存,因?yàn)樗匀槐灰胢_MyReference。
這很糟糕嗎?這取決于 MyClass2 和 MyClass1 真正在做什么。
如果您知道 MyClass2 可能有很長的生命周期并且您希望保留對 MyClass2 的引用但要釋放與 MyClass1 關(guān)聯(lián)的內(nèi)存,則必須執(zhí)行類似于以下代碼的操作:
class MyClass2
{
private MyClass1 m_MyReference;
public MyClass2()
{
m_MyReference = new MyClass1();
}
public void DoSomething()
{
// do something here that uses m_MyReference.
}
public void Dispose()
{
m_MyReference = null;
}
}
通過這種方式,您可以向調(diào)用者公開一種方式,表明您不再持有對您不需要的實(shí)例的引用。
請記住,簡單地分配null給一個(gè)變量或字段,不會自動(dòng)釋放內(nèi)存。垃圾收集器是異步的,并在它決定時(shí)運(yùn)行。希望在不深入的情況下給出這個(gè)想法。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
這個(gè)問題的措辭很奇怪。GC 的工作不需要幫助。它會在任何強(qiáng)加的約束條件下工作,如果不能滿足約束條件,它就會失敗。
當(dāng)然工作可以改變,但這并不是為了減輕 GC 的負(fù)擔(dān)——它不是一個(gè)會厭倦其工作的人——而是出于一些不可告人的動(dòng)機(jī),比如改進(jìn)整體程序表現(xiàn)。
這些事情通常被定義為延遲、能耗、吞吐量或內(nèi)存占用優(yōu)化。但這些并不是程序員關(guān)心的唯一指標(biāo)。簡單性和代碼可讀性也很重要。
樸素的代碼可讀性更強(qiáng),但性能更差。如果您的目標(biāo)是易于閱讀的代碼,那么執(zhí)行減少 GC 負(fù)載的復(fù)雜優(yōu)化可能會適得其反,因此“幫助 GC”本身并不是目標(biāo)。
現(xiàn)在,如果您的目標(biāo)是提高某些性能指標(biāo),那么一些優(yōu)化還涉及編寫代碼來減少內(nèi)存管理(分配 + GC)子系統(tǒng)所做的工作。一些可能的優(yōu)化包括避免終結(jié)器、發(fā)現(xiàn)內(nèi)存泄漏、減少不必要的分配、避免龐大的 Object[] 數(shù)組、調(diào)整 GC 參數(shù)、購買更好的硬件和縮短對象的生命周期。哪種優(yōu)化適用取決于應(yīng)用程序,最好通過分析器、GC 日志記錄和相關(guān)的工具來確定

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
垃圾收集器的工作非常高效靈巧,但我們可以通過將變量和對象指向 null 來增強(qiáng)其收集垃圾的能力,這些變量和對象不再被使用,也不再有對它們的引用。在文件處理期間使用close()
和flush()
方法。并且在線程處理中,在不使用時(shí)銷毀線程。
添加回答
舉報(bào)