標籤:分配 啟動 class 距離 一個 注意 bag 變數 處理
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記憶體回收