Python垃圾回收機制如何工作?

python的垃圾回收機制通過引用計數和垃圾收集器(gc模塊)管理內存。引用計數在對象無引用時立即釋放內存,但無法處理循環引用;gc模塊可檢測并回收循環引用,僅作用于容器類對象,默認啟用且可手動調用或調整閾值;分代回收將對象分為三代以提升效率,第0代回收最頻繁,第2代最少;可通過sys.getrefcount查看引用數,weakref觀察回收情況,tracemalloc或pympler分析內存泄漏。理解這些機制有助于優化代碼性能與內存使用。

Python垃圾回收機制如何工作?

python 的垃圾回收機制主要依賴引用計數和垃圾收集器(gc 模塊)來自動管理內存。簡單來說,當一個對象不再被任何變量或結構引用時,它所占用的內存就會被釋放。這個過程對開發者來說基本是透明的,但理解其原理有助于寫出更高效、穩定的代碼。

Python垃圾回收機制如何工作?


引用計數:最基礎的回收方式

Python 中每個對象都有一個“引用計數”,記錄有多少地方在使用它。一旦這個數字變成 0,說明這個對象已經沒用了,內存會被立即釋放。

Python垃圾回收機制如何工作?

舉個例子:

立即學習Python免費學習筆記(深入)”;

a = [1, 2, 3]   # 列表對象的引用計數為1 b = a           # 引用計數增加到2 del a           # 引用計數減為1 del b           # 引用計數減為0,內存被釋放

這種方式簡單高效,但它有個明顯的缺點:無法處理循環引用。比如兩個對象互相引用,它們的引用計數都不會為 0,但實際上這兩個對象已經沒有外部引用了。

Python垃圾回收機制如何工作?


垃圾收集器(gc 模塊):解決循環引用問題

為了解決引用計數的缺陷,Python 引入了垃圾收集器模塊 gc。它會定期掃描那些可能存在循環引用的對象,并嘗試回收它們。

  • 它只處理容器類對象(如 list、dict、class 實例等)
  • 默認情況下,gc 是啟用的
  • 可以手動調用 gc.collect() 來強制進行一次垃圾回收

你還可以通過 gc.set_threshold() 調整觸發垃圾回收的頻率,這在性能敏感的場景中可能有用。

如果你發現程序內存持續增長,可能是存在大量循環引用而沒有及時回收,可以考慮檢查是否禁用了 gc 或者調整閾值。


分代回收:提升效率的小技巧

為了減少頻繁掃描所有對象帶來的性能損耗,Python 使用了分代回收策略。對象被分為三代(0、1、2),新創建的對象屬于第 0 代,經過幾次回收后仍然存活的會被移到更高代。

  • 第 0 代回收最頻繁
  • 第 2 代回收最少
  • 這樣做的好處是:越老的對象越穩定,不用頻繁檢查

你可以通過 gc.get_threshold() 查看當前各代的回收閾值。如果想優化性能,適當調高代數的閾值可以減少 gc 的運行次數,但可能會延遲內存釋放。


如何查看和調試內存使用?

如果你想看看某個對象是否真的被釋放了,或者懷疑有內存泄漏,可以用以下方法:

  • 使用 sys.getrefcount(obj) 查看引用計數(注意這個函數本身也會增加引用)
  • 用 weakref 創建弱引用,觀察對象是否被回收
  • 配合 tracemalloc 或第三方庫如 pympler 進行內存分析

有時候即使你寫了 del obj,也不代表內存馬上釋放,因為還有其他潛在的引用未清除。


基本上就這些。Python 的垃圾回收機制在大多數情況下都能很好地工作,但了解它的機制能幫你避免一些常見的內存問題。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享