垃圾回收系統(tǒng),不僅需要收回釋放的對(duì)象,還要控制內(nèi)存碎片化。
標(biāo)記清掃:第一追蹤階段,第二清掃階段。深度優(yōu)先遍歷全部?jī)杀?,效率低下?/p>
? ? ? ? ? ? ? ? ? 效率解決方案:把清掃工作交個(gè)分配器,但是會(huì)造成內(nèi)存碎片。
? ? ? ? ? ? ? ? ? 內(nèi)存碎片解決方案:用一個(gè)數(shù)字來取模,讓回收延遲幾個(gè)周期。(因?yàn)榫植啃?,?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 個(gè)周期后會(huì)成批死亡,雖然會(huì)內(nèi)存泄露)
標(biāo)記整理:標(biāo)記階段、整理階段。整體過程中,會(huì)多次遍歷堆。
? ? ? ? ? ? ? ? ? 解決方案:優(yōu)先使用標(biāo)記清楚,碎片率到達(dá)一定程度再整理。
標(biāo)記復(fù)制:只需對(duì)活著的對(duì)象遍歷復(fù)制一次。堆空間會(huì)下降一半,長(zhǎng)壽數(shù)據(jù)就比較麻煩。
? ? ? ? ? ? ? ? ? 解決方案:臨時(shí)變量推薦復(fù)制,全部變量建議整理算法。
引用計(jì)數(shù):將開銷分?jǐn)傇诔绦蜻\(yùn)行中。當(dāng)系統(tǒng)部分不可用時(shí),也可以回收部分內(nèi)存,分布式中 ? ? ? ? ? ? ? ? ? ? 十分有用。但是需要編譯器和運(yùn)行時(shí)系統(tǒng)支持,不然在指針操作非線程安全的情況 ? ? ? ? ? ? ? ? ? ? 下有問題。引用計(jì)數(shù)頻繁操作、原子性。
? ? ? ? ? ? ? ? ? 解決方案:延遲、合并引用計(jì)數(shù),在開始、結(jié)束時(shí)保持?jǐn)?shù)據(jù)一致性。
? ? ? ? ? ? ? ? ? 無法解決環(huán)狀問題。
? ? ? ? ? ? ? ? ? 解決方案:偶爾追蹤回收,或者實(shí)驗(yàn)刪除法。
? ? ? ? ? ? ? ? ? 引用計(jì)數(shù)位數(shù)問題。
? ? ? ? ? ? ? ? ? 解決方案:偶爾追蹤修正引用計(jì)數(shù)值。
非移動(dòng)算法:標(biāo)記清掃、引用計(jì)數(shù)。Bool、int
? ? ? ? ? ? ? ? ? 長(zhǎng)期運(yùn)行會(huì)使堆碎片化。
移動(dòng)算法:標(biāo)記整理、標(biāo)記復(fù)制
? ? ? ? ? ? ? ? ? 開銷大,不常使用,建議碎片率達(dá)到一定程度才建議使用。
分代回收:把對(duì)象分代進(jìn)行處理,類似分段函數(shù)??梢杂行У慕Y(jié)合他們的優(yōu)點(diǎn)、避免缺點(diǎn)。分 ? ? ? ? ? ? ? ? ? ?段函數(shù)的系數(shù)可以PID來動(dòng)態(tài)調(diào)整。
? ? ? ? ? ? ? ? ?同一代中可以進(jìn)行分桶,桶滿了才給升代。升代只需要移動(dòng)指針就可以了。
? ? ? ? ? ? ? ? ?超引用計(jì)數(shù):引用計(jì)數(shù)管理年老代,復(fù)制回收管理年輕代。