1. 程式人生 > >Python如何進行記憶體管理的?

Python如何進行記憶體管理的?

Python在進行記憶體管理從三個方面進行:

物件的引用計數機制

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

  • 引用計數增加的情況:
  1. 一個物件分配一個新名稱
  2. 將其放入一個容器中(如列表List,元組tuple和字典dict)
  • 引用計數減少的情況:
  1. 使用del語句對 物件別名顯示的銷燬
  2. 引用超出作用域或被重新賦值

sys.getrefcount()函式可以獲得物件的當前引用計數。多數情況下,引用計數比你猜測的要大的多,對於不可變資料(如數字和字串),直譯器會在程式的不同部分共享記憶體,以便節約記憶體。

垃圾回收機制

python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。

  • 引用計數:Python在記憶體中儲存每個物件的引用計數,如果計數變成0,該物件就會消失,分配給該物件的記憶體就會釋放出來。
  • 標記-清除:一些容器物件,比如說list、dict、tuple、instance等可能會出現引用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。
  • 分代收集:Python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。

記憶體池機制

python提供了對記憶體的垃圾收集機制,將不用的的記憶體放到記憶體池

而不是返回給作業系統。

  • Pymalloc機制,為了加速Python的執行效率,Python引入了一個Pymalloc機制,用於管理對小塊記憶體(小於256個位元組的物件)的申請和釋放。
  • malloc機制,Python中小於256個位元組的物件都使用Pymalloc實現的分配器,而大的物件則使用系統的malloc.
  • 私有記憶體池,對於Python物件,如整數,浮點數和list,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。