Python內存釋放問題


在項目中遇到一個很糟糕的問題,運行一個Python服務腳本,把服務器跑死了,以前以為開的進程過多,進程中因批量處理,導致內存和交換分區耗光引起的。后來才發現,確實是內存和交換分區無空間導致的死機,但卻不是因為多進程分析引起的。

從網上看了很多資料,相關信息並不多,最后確定是由於Python對大對象內存的釋放引起的。在一個對象的引用計數減為0時,與該對象對應的析構函數就會被調用,但是要特別注意的是,調用析構函數並不意味着最終一定會調用free釋放內存空間,如果真是這樣的話,那頻繁地申請、釋放內存空間會使 Python的執行效率大打折扣。

Python內存管理規則:
del的時候,把list的元素釋放掉,把管理元素的大對象回收到python對象緩沖池里.
由此可見:python內存管理雖然很優秀,但是比較消耗內存.

一般來說,Python中大量采用了內存對象池的技術,使用這種技術可以避免頻繁地申請和釋放內存空間。因此在析構時,通常都是將對象占用的空間歸還到內存池中。

我查看到一句話:也許能夠回答自己的問題.

“這個問題就是:Python的arena從來不釋放pool。這個問題為什么會引起類似於內存泄漏的現象呢。考慮這樣一種情形,申請10*1024*1024個16字節的小內存,這就意味着必須使用160M的內存,由於Python沒有默認將前面提到的限制內存池的WITH_MEMORY_LIMITS編譯符號打開,所以Python會完全使用arena來滿足你的需求,這都沒有問題,關鍵的問題在於過了一段時間,你將所有這些16字節的內存都釋放了,這些內存都回到arena的控制中,似乎沒有問題。但是問題恰恰就在這時出現了。因為 arena始終不會釋放它維護的pool集合,所以這160M的內存始終被Python占用,如果以后程序運行中再也不需要160M如此巨大的內存,這點內存豈不是就浪費了?”

對Python內存釋放的機制還不是太明白,繼續學習中。



參考資料:
http://www.iteye.com/topic/309753
Why doesn’t Python release the memory when I delete a large object?
How does Python manage memory?
http://pythoner.net/wiki/96/
http://pythoner.net/wiki/56/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM