1. 程式人生 > >Python垃圾回收

Python垃圾回收

返回 顯式 三種 reac ati 等於 ner cti 垃圾回收機制

Python中的垃圾回收是以引用計數為主,分代收集為輔。引用計數的缺陷是循環引用的問題。

有三種情況會觸發垃圾回收:
1.調用gc.collect(),
2.當gc模塊的計數器達到閥值的時候。
3.程序退出的時候

四.gc模塊常用功能解析

Garbage Collector interface
gc模塊提供一個接口給開發者設置垃圾回收的選項。上面說到,采用引用計數的方法管理內存的一個缺陷是循環引用,而gc模塊的一個主要功能就是解決循環引用的問題。

常用函數:

  1. gc.set_debug(flags)
    設置gc的debug日誌,一般設置為gc.DEBUG_LEAK
  2. gc.collect([generation])
    顯式進行垃圾回收,可以輸入參數,0代表只檢查第一代的對象,1代表檢查一,二代的對象,2代表檢查一,二,三代的對象,如果不傳參數,執行一個full collection,也就是等於傳2。
    返回不可達(unreachable objects)對象的數目
  3. gc.set_threshold(threshold0[, threshold1[, threshold2])
    設置自動執行垃圾回收的頻率。
  4. gc.get_count()
    獲取當前自動執行垃圾回收的計數器,返回一個長度為3的列表

gc模塊的自動垃圾回收機制

必須要import gc模塊,並且is_enable()=True才會啟動自動垃圾回收。
這個機制的主要作用就是發現並處理不可達的垃圾對象。
垃圾回收=垃圾檢查+垃圾回收
在Python中,采用分代收集的方法。把對象分為三代,一開始,對象在創建的時候,放在一代中,如果在一次一代的垃圾檢查中,改對象存活下來,就會被放到二代中,同理在一次二代的垃圾檢查中,該對象存活下來,就會被放到三代中。

gc模塊裏面會有一個長度為3的列表的計數器,可以通過gc.get_count()獲取。
例如(488,3,0),其中488是指距離上一次一代垃圾檢查,Python分配內存的數目減去釋放內存的數目,註意是內存分配,而不是引用計數的增加。例如:

應用

  1. 項目中避免循環引用
  2. 引入gc模塊,啟動gc模塊的自動清理循環引用的對象機制
  3. 由於分代收集,所以把需要長期使用的變量集中管理,並盡快移到二代以後,減少GC檢查時的消耗
  4. gc模塊唯一處理不了的是循環引用的類都有__del__方法,所以項目中要避免定義__del__方法,如果一定要使用該方法,同時導致了循環引用,需要代碼顯式調用gc.garbage裏面的對象的__del__
    來打破僵局

Python垃圾回收