Python記憶體回收

來源:互聯網
上載者:User

標籤:分配   啟動   class   距離   一個   注意   bag   變數   處理   

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記憶體回收

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.