Python:gc模塊使用和垃圾回收機(jī)制

簡(jiǎn)介:gc模塊即Python中垃圾回收模塊,它提供可選的垃圾回收器的接口。同時(shí)提供對(duì)回收器找到但是無法釋放的不可達(dá)對(duì)象的訪問。由于 Python 使用了帶有引用計(jì)數(shù)的回收器,如果你確定你的程序不會(huì)產(chǎn)生循環(huán)引用,你可以關(guān)閉回收器??梢酝ㄟ^調(diào)用 gc.disable() 關(guān)閉自動(dòng)垃圾回收。

Python中垃圾回收:
python的垃圾回收器把所有對(duì)象分類為三代,其依據(jù)是對(duì)象在多少次垃圾回收后幸存。新建對(duì)象會(huì)被放在最年輕代(第 0 代)。如果一個(gè)對(duì)象在一次垃圾回收后幸存,它會(huì)被移入下一個(gè)較老代。由于第 2 代是最老代,這一代的對(duì)象在一次垃圾回收后仍會(huì)保留原樣。為了確定何時(shí)要運(yùn)行,垃圾回收器會(huì)跟蹤自上一次回收后對(duì)象分配和釋放的數(shù)量。當(dāng)分配數(shù)量減去釋放數(shù)量的結(jié)果值大于 threshold0 時(shí),垃圾回收就會(huì)開始。初始時(shí)只有第 0 代會(huì)被檢查。如果自第 1 代被檢查后第 0 代已被檢查超過 threshold1 次,則第 1 也會(huì)被檢查。對(duì)于第三代來說情況還會(huì)更復(fù)雜。

圖解分代回收:

圖片

提供的功能包括:

1、關(guān)閉收集器
2、調(diào)整收集頻率
3、設(shè)置調(diào)試選項(xiàng)

主要方法:

enable()             --啟用自動(dòng)垃圾回收。
disable()            --禁用自動(dòng)垃圾回收。
isenabled()          --如果啟用了自動(dòng)收集,則返回true。
collect()            --立即執(zhí)行完全收集。
get_count()          --返回當(dāng)前集合計(jì)數(shù)。
get_stats()          --返回包含每代統(tǒng)計(jì)信息的詞典列表。
set_debug()          --設(shè)置調(diào)試標(biāo)志。
get_debug()          --獲取調(diào)試標(biāo)志。
set_threshold()      --設(shè)置收集閾值。
get_threshold()      --返回集合閾值的當(dāng)前值。
get_objects()        --返回收集器跟蹤的所有對(duì)象的列表。
is_tracked()         --如果跟蹤給定對(duì)象,則返回true。
is_finalized()       --如果給定對(duì)象已定稿,則返回true。
get_referrers()      --返回引用對(duì)象的對(duì)象列表。
get_referents()      --返回對(duì)象引用的對(duì)象列表。
freeze()             --凍結(jié)所有跟蹤對(duì)象,并在將來的收集中忽略它們。
unfreeze()           --解凍永久生成中的所有對(duì)象。
get_freeze_count()   --返回永久生成中的對(duì)象數(shù)。

最常用的方法:gc.collect() --立即執(zhí)行完全收集,釋放出不使用的資源,歸還內(nèi)存??梢酝ㄟ^參數(shù)generation,單獨(dú)對(duì)0,1,2代進(jìn)行回收釋放。

單獨(dú)對(duì)特定代收集:

=
import gc
gc.collect(generation=0)
gc.collect(generation=1)
gc.collect(generation=2)

案例源碼:

import subprocess, psutil, gc

mem1 = psutil.virtual_memory()
print(f"某程序前內(nèi)存已使用:{mem1.used}")
print(f"某程序前內(nèi)存剩余:{mem1.free}")
print(f"某程序前內(nèi)存百分比:{mem1.percent}")

app1 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe')
app2 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe')
app3 = subprocess.Popen(r'D:\IntelliJ IDEA Community Edition 2020.1.2\bin\idea64.exe')

mem2 = psutil.virtual_memory()
print(f"某程序后內(nèi)存已使用:{mem2.used}")
print(f"某程序后內(nèi)存剩余:{mem2.free}")
print(f"某程序后內(nèi)存百分比:{mem2.percent}")

app1.kill()
app2.kill()
app3.kill()

gc.collect()
mem3 = psutil.virtual_memory()
print(f"GC回收后內(nèi)存已使用:{mem3.used}")
print(f"GC回收后內(nèi)存剩余:{mem3.free}")
print(f"GC回收后內(nèi)存百分比:{mem3.percent}")

執(zhí)行收集前后內(nèi)存變化:

圖片

需要注意的是:執(zhí)行收集本身也需要一點(diǎn)的內(nèi)存代價(jià),所以可能存在收集完成后內(nèi)存反而增加的情況。

圖片

微信公眾號(hào):玩轉(zhuǎn)測(cè)試開發(fā)
歡迎關(guān)注,共同進(jìn)步,謝謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容