1. 程式人生 > >Python管理記憶體

Python管理記憶體

Python對記憶體的管理要從三個方面來說:1.物件的引用計數機制、2.垃圾回收機制、 3.記憶體池機制

1. 物件的引用機制

Pyhton的內部使用引用計數,來保持記憶體中的物件,所有物件都有引用計數。

(1) 引用計數增加:
  1. 一個物件分配一個新名稱
  2. 將其放入一個容器中(列表、元素或字典)
(2) 引用減少的情況
  1. 使用del語句將物件的別名顯式的銷燬
  2. 引用被重新賦值
    獲取應用物件:
    通過sys.getrefcount( )函式獲取某個引用的引用數,函式引數實際上建立了一個臨時的引用。因此,getrefcount( )所得到的結果,會比期望多1。

2.垃圾回收

  1. 當一個物件的引用計數歸零時,它將被垃圾回收機制處理掉
  2. python的自動垃圾回收:當分配物件的次數和取消分配物件的次數的差值高於某個閾值時,垃圾回收才會啟動。
分代回收

python分代回收基本策略:存活時間越久的物件,越不可能在後面的程式中變成垃圾。(在垃圾回收的過程中,減少“長壽”物件的掃描頻率)。
1. Python將所有的物件分為0, 1, 2三代。所有新建的物件都是0代物件。2. 當某一代物件經歷過垃圾回收,依然存活,那麼它就被歸入下一代物件。
3. 每次垃圾回收啟動時,一定會掃描所有0代物件。如果0代物件經過一定次數 垃圾回收,那麼就會啟動0代和1代的掃描清理。當1代經歷一定次數的垃圾回收後,那麼會啟動對0,1,2,即對所有物件進行掃描。
4. 對於函式set_threshold(),返回(700, 10, 10),700為分配物件和取消分配物件的差值,當差值大於700時,啟動垃圾回收;每10次0代垃圾回收,會配合1次1代的垃圾回收;每10次1代垃圾回收,會配合1次2代的垃圾回收。

3. 記憶體池機制

Python的記憶體垃圾回收機制,將不用的記憶體放到記憶體池而不是返回給作業系統。
1. Pymalloc機制。為了加速Python的執行效率,Python引入記憶體池機制,用於管理對小塊記憶體的管理和釋放。
2. 對於所有小於256個位元組的物件都使用pymalloc實現的分配器;而大於這個長度的物件則使用系統的malloc。
3. 對於Python物件,如整數、浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。如果你分配又釋放了大量的整數,用於快取這些整數的記憶體不能再分配給浮點數。
參考資料:
1. Python的記憶體管理:

https://www.cnblogs.com/vamei/p/3232088.html
2. Python的記憶體管理:https://www.cnblogs.com/wangyuhangboke/p/7802253.html
2. Python常見的面試題: http://www.cnblogs.com/Allen-rg/p/7689435.html