第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何編寫代碼來幫助垃圾收集器

如何編寫代碼來幫助垃圾收集器

犯罪嫌疑人X 2022-12-21 15:20:08
在面試中我遇到了一個(gè)問題——“如何在編寫代碼時(shí)幫助垃圾收集器?”。在我看來,GC 工作得非常好,我們不需要使用比基本的良好代碼實(shí)踐更多的東西,后來補(bǔ)充說,在 finally 子句中關(guān)閉資源肯定有助于 GC,但通常對這樣的問題感到驚訝。有好的回復(fù)嗎?我們需要做一些不可思議的事情來幫助垃圾收集器嗎?
查看完整描述

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è)想法。


查看完整回答
反對 回復(fù) 2022-12-21
?
烙印99

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)的工具來確定


查看完整回答
反對 回復(fù) 2022-12-21
?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

垃圾收集器的工作非常高效靈巧,但我們可以通過將變量和對象指向 null 來增強(qiáng)其收集垃圾的能力,這些變量和對象不再被使用,也不再有對它們的引用。在文件處理期間使用close()flush()方法。并且在線程處理中,在不使用時(shí)銷毀線程。



查看完整回答
反對 回復(fù) 2022-12-21
  • 3 回答
  • 0 關(guān)注
  • 159 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號