Python內存管理機制

1 概述


對於Python這樣的動態語言,如何高效的管理內存,是很重要的一部分,在很大程度上決定了Python的執行效率。與大多數編程語言不同,Python中的變量無需事先申明,變量無需指定類型,程序員無需關心內存管理,Python解釋器給你自動回收。我們知道在變量分配內存時,是借用系統資源,在使用完成後,應該歸還所借用的系統資源,Python承擔了這個複雜的內存管理工作,從而讓程序員更加的關注程序的編寫質量上。

在執行過程中,Python會頻繁的創建和銷燬大量的對象,這些都涉及到內存的管理。以下從三個方面來分析Python是如何進行內存管理的。


2 對象的引用計數機制


在Python中是通過引用計數來保持對內存中的變量追蹤的,也就是做Python內部記錄中所有在使用對象各有多少個引用。Python中有個內部跟蹤變量叫做引用計數器,每個變量有多少個引用,簡稱引用計數。當某個對象的引用計數爲0時,就列入了垃圾回收隊列。

引用計數增加的情況:

1. 一個對象分配一個新名稱

2. 將其放入一個容器中(如列表、元組或字典)


引用計數減少的情況:

1. 使用del語句對對象別名顯式的銷燬

2. 引用超出作用域或被重新賦值


sys.getrefcount( )函數可以獲得對象的當前引用計數

多數情況下,引用計數比你猜測得要大得多。對於不可變數據(如數字和字符串),解釋器會在程序的不同部分共享內存,以便節約內存。


3 垃圾回收機制


3.1 當一個對象的引用計數歸零時,與該對象對應的析構函數就會被調用,但調用析構函數並不意味着最終一定要調用free釋放內存空間,通常是將該對象通過垃圾收集機制處理,將其佔用的空間歸還到內存池中。


3.2 當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,並銷燬用於引用底層對象的名稱。然而由於每個對象都包含一個對其他對象的應用,因此引用計數不會歸零,對象也不會銷燬。(從而導致內存泄露)。爲解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環並刪除它們。


4 內存池機制


Python提供了對內存的垃圾回收機制,但是它將不用的內存放到內存池而不是返回給操作系統。


4.1 小塊內存池機制Pymalloc機制


在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請後,很快又會被釋放,由於這些內存的申請並不是爲了創建對象,所以並沒有對象一級的內存池機制。這就意味着在運行期間,Python會大量的執行malloc和free操作。爲了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放,即Pymalloc機制。


1. 當申請的內存小於256字節時,PyObject_Malloc會在內存池中申請內存;當申請的內存大於256字節時,PyObject_Malloc的行爲將蛻化爲malloc的行爲。當然,通過修改Python源代碼,我們可以改變這個默認值,從而改變Python的默認內存管理行爲。


2. 對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。

                                                                                                                               ——遊響雲停



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章