記錄: 一個腳本在連續運行后,使用內存越來越大,在循環后手動添加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