Python垃圾回收
阿新 • • 發佈:2018-03-15
返回 顯式 三種 reac ati 等於 ner cti 垃圾回收機制
Python中的垃圾回收是以引用計數為主,分代收集為輔。引用計數的缺陷是循環引用的問題。
有三種情況會觸發垃圾回收:
1.調用gc.collect()
,
2.當gc模塊的計數器達到閥值的時候。
3.程序退出的時候
四.gc模塊常用功能解析
Garbage Collector interface
gc模塊提供一個接口給開發者設置垃圾回收的選項。上面說到,采用引用計數的方法管理內存的一個缺陷是循環引用,而gc模塊的一個主要功能就是解決循環引用的問題。
常用函數:
- gc.set_debug(flags)
設置gc的debug日誌,一般設置為gc.DEBUG_LEAK - gc.collect([generation])
顯式進行垃圾回收,可以輸入參數,0代表只檢查第一代的對象,1代表檢查一,二代的對象,2代表檢查一,二,三代的對象,如果不傳參數,執行一個full collection,也就是等於傳2。
返回不可達(unreachable objects)對象的數目 - gc.set_threshold(threshold0[, threshold1[, threshold2])
設置自動執行垃圾回收的頻率。 - gc.get_count()
獲取當前自動執行垃圾回收的計數器,返回一個長度為3的列表
gc模塊的自動垃圾回收機制
必須要import gc模塊,並且is_enable()=True才會啟動自動垃圾回收。
這個機制的主要作用就是發現並處理不可達的垃圾對象。
垃圾回收=垃圾檢查+垃圾回收
在Python中,采用分代收集的方法。把對象分為三代,一開始,對象在創建的時候,放在一代中,如果在一次一代的垃圾檢查中,改對象存活下來,就會被放到二代中,同理在一次二代的垃圾檢查中,該對象存活下來,就會被放到三代中。
gc模塊裏面會有一個長度為3的列表的計數器,可以通過gc.get_count()
獲取。
例如(488,3,0)
,其中488
是指距離上一次一代垃圾檢查,Python分配內存的數目減去釋放內存的數目,註意是內存分配,而不是引用計數的增加。例如:
應用
- 項目中避免循環引用
- 引入gc模塊,啟動gc模塊的自動清理循環引用的對象機制
- 由於分代收集,所以把需要長期使用的變量集中管理,並盡快移到二代以後,減少GC檢查時的消耗
- gc模塊唯一處理不了的是循環引用的類都有
__del__
方法,所以項目中要避免定義__del__
方法,如果一定要使用該方法,同時導致了循環引用,需要代碼顯式調用gc.garbage
裏面的對象的__del__
Python垃圾回收