python內存泄漏


記錄: 一個腳本在連續運行后,使用內存越來越大,在循環后手動添加gc.collect()沒有作用。

 

嘗試方法:

去除所有函數中當作參數傳入的全局變量

使用全局redis對象,不再當作參數傳入

循環末尾使用del顯式刪除變量循環中生成的變量,然后調用gc.collect()

主函數結尾刪除函數中使用的變量,懷疑這寫部分有可能循環引用。

 

update: 還是有內存泄漏,嘗試將所有的語句盡可能封裝在函數中,函數執行完成后,變量會回收。

--沒解決問題 刪除了一個igetui的全局的class,每次調用時再創建,使用完刪除,觀察。

 

update again: 使用objgraph在主函數開始和結束的時候objgraph.show_growth() 發現tuple在每次運行結束之后都會增加,逐個檢查主函數中的子函數,發現tuple增加很可能是由於數據庫操作函數引起,查看函數運行時輸出,發現數據庫操作的時候有警告,"Warning: Truncated incorrect time value: ",懷疑可能時在這個時候拋出警告引起了內存泄漏,查看警告個數和增加的tuple個數相差無幾,於是修改sql,之后再次用objgraph.show_growth()查看,函數運行兩次后,不再有tuple增加,觀察一段時間,memory使用穩定。

 

 

ref:

https://stackoverflow.com/questions/2017381/is-it-possible-to-have-an-actual-memory-leak-in-python-because-of-your-code

https://stackoverflow.com/questions/1316767/how-can-i-explicitly-free-memory-in-python

https://stackoverflow.com/questions/1641717/manual-garbage-collection-in-python

http://www.cnblogs.com/xybaby/p/7491656.html


免責聲明!

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



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