簡介:gc模塊即Python中垃圾回收模塊,它提供可選的垃圾回收器的接口。同時提供對回收器找到但是無法釋放的不可達對象的訪問。由于 Python 使用了帶有引用計數的回收器,如果你確定你的程序不會產生循環引用,你可以關閉回收器。可以通過調用 gc.disable() 關閉自動垃圾回收。
Python中垃圾回收:
python的垃圾回收器把所有對象分類為三代,其依據是對象在多少次垃圾回收后幸存。新建對象會被放在最年輕代(第 0 代)。如果一個對象在一次垃圾回收后幸存,它會被移入下一個較老代。由于第 2 代是最老代,這一代的對象在一次垃圾回收后仍會保留原樣。為了確定何時要運行,垃圾回收器會跟蹤自上一次回收后對象分配和釋放的數量。當分配數量減去釋放數量的結果值大于 threshold0 時,垃圾回收就會開始。初始時只有第 0 代會被檢查。如果自第 1 代被檢查后第 0 代已被檢查超過 threshold1 次,則第 1 也會被檢查。對于第三代來說情況還會更復雜。
圖解分代回收:
圖片
提供的功能包括:
1、關閉收集器
2、調整收集頻率
3、設置調試選項
主要方法:
enable() --啟用自動垃圾回收。
disable() --禁用自動垃圾回收。
isenabled() --如果啟用了自動收集,則返回true。
collect() --立即執行完全收集。
get_count() --返回當前集合計數。
get_stats() --返回包含每代統計信息的詞典列表。
set_debug() --設置調試標志。
get_debug() --獲取調試標志。
set_threshold() --設置收集閾值。
get_threshold() --返回集合閾值的當前值。
get_objects() --返回收集器跟蹤的所有對象的列表。
is_tracked() --如果跟蹤給定對象,則返回true。
is_finalized() --如果給定對象已定稿,則返回true。
get_referrers() --返回引用對象的對象列表。
get_referents() --返回對象引用的對象列表。
freeze() --凍結所有跟蹤對象,并在將來的收集中忽略它們。
unfreeze() --解凍永久生成中的所有對象。
get_freeze_count() --返回永久生成中的對象數。
最常用的方法:gc.collect() --立即執行完全收集,釋放出不使用的資源,歸還內存。可以通過參數generation,單獨對0,1,2代進行回收釋放。
單獨對特定代收集:
=
import gc
gc.collect(generation=0)
gc.collect(generation=1)
gc.collect(generation=2)
案例源碼:
import subprocess, psutil, gc
mem1 = psutil.virtual_memory()
print(f"某程序前內存已使用:{mem1.used}")
print(f"某程序前內存剩余:{mem1.free}")
print(f"某程序前內存百分比:{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"某程序后內存已使用:{mem2.used}")
print(f"某程序后內存剩余:{mem2.free}")
print(f"某程序后內存百分比:{mem2.percent}")
app1.kill()
app2.kill()
app3.kill()
gc.collect()
mem3 = psutil.virtual_memory()
print(f"GC回收后內存已使用:{mem3.used}")
print(f"GC回收后內存剩余:{mem3.free}")
print(f"GC回收后內存百分比:{mem3.percent}")
執行收集前后內存變化:
圖片
需要注意的是:執行收集本身也需要一點的內存代價,所以可能存在收集完成后內存反而增加的情況。
圖片
微信公眾號:玩轉測試開發
歡迎關注,共同進步,謝謝!