1. 程式人生 > >python-Django 記憶體洩露問題

python-Django 記憶體洩露問題

一、python有自動垃圾回收機制(當物件的引用計數為零時直譯器會自動釋放記憶體),出現記憶體洩露的場景一般是擴充套件庫記憶體洩露或者迴圈引用(還有一種是全域性容器裡的物件沒有刪除)

前者無需討論,後者舉例如下(Obj('B')和Obj('C')的記憶體沒有回收)(貌似迴圈引用的記憶體,Python直譯器也會自己回收(標記-清除垃圾收集機制),只是時間早晚的問題,也就是說我們在編碼中不需要耗費精力去刻意避免迴圈引用,具體的內容這兩天再細看一下(http://stackoverflow.com/questions/4484167/details-how-python-garbage-collection-works

 原始碼剖析的垃圾收集那一章還沒看完真是心病啊)---2013.10.20)

  1. [[email protected] python_study]$ cat leak_test2.py   
  2. #encoding=utf-8
  3. class Obj:  
  4.     def __init__(self,name='A'):  
  5.         self.name = name  
  6.         print'%s inited' % self.name  
  7.     def __del__(self):  
  8.         print'%s deleted' % self.name  
  9. if __name__ == 
    '__main__':  
  10.     a = Obj('A')  
  11.     b = Obj('B')  
  12.     c = Obj('c')  
  13.     c.attrObj = b  
  14.     b.attrObj = c  
  15. [[email protected] python_study]$ vpython leak_test2.py   
  16. A inited  
  17. B inited  
  18. c inited  
  19. A deleted  

該模組可以找到增長最快的物件、實際最多的物件,可以畫出某物件裡面所有元素的引用關係圖、某物件背後的所有引用關係圖;可以根據地址獲取物件

但是用它來找記憶體洩露還是有點大海撈針的感覺:需要自己更具增長最快、實際最多物件的日誌來確定可疑物件(一般是list/dict/tuple等common物件,這個很難排查;如果最多最快的是自定義的非常規物件則比較好確定原因)

1.show_refs() show_backrefs() show_most_common_types() show_growth()

  1. [[email protected] python_study]$ !cat  
  2. cat objgraph1.py   
  3. #encoding=utf-8
  4. import objgraph  
  5. if __name__ == '__main__':  
  6.         x = []  
  7.         y = [x, [x], dict(x=x)]  
  8.         objgraph.show_refs([y], filename='/tmp/sample-graph.png'#把[y]裡面所有物件的引用畫出來
  9.         objgraph.show_backrefs([x], filename='/tmp/sample-backref-graph.png'#把對x物件的引用全部畫出來
  10.         #objgraph.show_most_common_types() #所有常用型別物件的統計,資料量太大,意義不大
  11.         objgraph.show_growth(limit=4#列印從程式開始或者上次show_growth到現在增加的物件(按照增加量的大小排序)
  12. [[email protected] python_study]$ !vpython  
  13. vpython objgraph1.py   
  14. Graph written to /tmp/tmpuSFr9A.dot (5 nodes)  
  15. Image generated as /tmp/sample-graph.png  
  16. Graph written to /tmp/tmpAn6niV.dot (7 nodes)  
  17. Image generated as /tmp/sample-backref-graph.png  
  18. tuple                          3393     +3393
  19. wrapper_descriptor              945      +945
  20. function                        830      +830
  21. builtin_function_or_method      622      +622

sample-graph.png

sample-backref-graph.png

2.show_chain()

  1. [[email protected] python_study]$ cat objgraph2.py   
  2. #encoding=utf-8
  3. import objgraph, inspect, random  
  4. class MyBigFatObject(object):  
  5.         pass
  6. def computate_something(_cache = {}):  
  7.         _cache[42] = dict(foo=MyBigFatObject(),bar=MyBigFatObject())  
  8.         x = MyBigFatObject()  
  9. if __name__ == '__main__':  
  10.         objgraph.show_growth(limit=3)  
  11.         computate_something()  
  12.         objgraph.show_growth(limit=3)  
  13.         objgraph.show_chain(  
  14.                 objgraph.find_backref_chain(random.choice(objgraph.by_type('MyBigFatObject')),  
  15.                         inspect.ismodule),  
  16.                 filename = '/tmp/chain.png')  
  17.         #roots = objgraph.get_leaking_objects()
  18.         #print 'len(roots)=%d' % len(roots)
  19.         #objgraph.show_most_common_types(objects = roots)
  20.         #objgraph.show_refs(roots[:3], refcounts=True, filename='/tmp/roots.png')
  21. [[email protected] python_study]$ !vpython  
  22. vpython objgraph2.py   
  23. tuple                  3400     +3400
  24. wrapper_descriptor      945      +945
  25. function                831      +831
  26. wrapper_descriptor      956       +11
  27. tuple                  3406        +6
  28. member_descriptor       165        +4
  29. Graph written to /tmp/tmpklkHqC.dot (7 nodes)  
  30. Image generated as /tmp/chain.png  

chain.png


三、gc模組

該模組可以確定垃圾回收期無法引用到(unreachable)和無法釋放(uncollectable)的物件,跟objgraph相比有其獨到之處

gc.collect()強制回收垃圾,返回unreachable object的數量

gc.garbage返回unreachable object中uncollectable object的列表(都是些有__del__()解構函式並且身陷引用迴圈的物件)IfDEBUG_SAVEALL is set, then all unreachable objects will be added to this list rather than freed.

warning:如果用gc.disable()把自動垃圾回收關掉了,然後又不主動gc.collect(),你會看到記憶體刷刷的被消耗....

  1. [[email protected] python_study]$ cat gc_test.py   
  2. #encoding=utf-8
  3. import gc  
  4. class MyObj:  
  5.         def __init__(self, name):  
  6.                 self.name = name  
  7.                 print"%s inited" % self.name  
  8.         def __del__(self):  
  9.                 print"%s deleted" % self.name  
  10. if __name__ == '__main__':  
  11.         gc.disable()  
  12.         gc.set_debug(gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS | gc.DEBUG_SAVEALL)  
  13.         a = MyObj('a')  
  14.         b = MyObj('b')  
  15.         c = MyObj('c')  
  16.         a.attr = b  
  17.         b.attr = a  
  18.         a = None
  19.         b = None
  20.         c = None
  21.         if gc.isenabled():  
  22.                 print'automatic collection is enabled'
  23.         else:  
  24.                 print'automatic collection is disabled'
  25.         rt = gc.collect()  
  26.         print"%d unreachable" % rt  
  27.         garbages = gc.garbage  
  28.         print"\n%d garbages:" % len(garbages)  
  29.         for garbage in garbages:  
  30.                 if isinstance(garbage, MyObj):  
  31.                         print"obj-->%s name-->%s attrrMyObj-->%s" % (garbage, garbage.name, garbage.attr)  
  32.                 else:  
  33.                         print str(garbage)  
  34. [[email protected] python_study]$ vpython gc_test.py   
  35. a inited  
  36. b inited  
  37. c inited  
  38. c deleted  
  39. automatic collection is disabled  
  40. gc: uncollectable <MyObj instance at 0x7f3ebd455b48>  
  41. gc: uncollectable <MyObj instance at 0x7f3ebd455b90>  
  42. gc: uncollectable <dict 0x261c4b0>  
  43. gc: uncollectable <dict 0x261bdf0>  
  44. 4 unreachable  
  45. 4 garbages:  
  46. obj--><__main__.MyObj instance at 0x7f3ebd455b48> name-->a attrrMyObj--><__main__.MyObj instance at 0x7f3ebd455b90>  
  47. obj--><__main__.MyObj instance at 0x7f3ebd455b90> name-->b attrrMyObj--><__main__.MyObj instance at 0x7f3ebd455b48>  
  48. {'name''a''attr': <__main__.MyObj instance at 0x7f3ebd455b90>}  
  49. {'name''b''attr': <__main__.MyObj instance at 0x7f3ebd455b48>}  

四、pdb模組

命令和gdb差不錯(只是列印資料的時候不是必須加個p,而且除錯介面和操作類似python互動模式)

h(elp) 幫助

c(ontinue)  繼續

n(ext) 下一個語句

s(tep)  下一步(跟進函式內部)

b(reak) 設定斷點

l(ist) 顯示程式碼

bt 呼叫棧

回車 重複上一個命令

....

鳥人喜歡在需要除錯的地方加入pdb.set_trace()然後進入狀態....(其他還有好多方式備選)

五、django記憶體洩露

Django isn't known to leak memory. If you find your Django processes areallocating more and more memory, with no sign of releasing it, check to makesure yourDEBUG setting is set toFalse. IfDEBUGisTrue, then Django saves a copy of every SQL statement it has executed.

To fix the problem, set DEBUG toFalse.

If you need to clear the query list manually at any point in your functions,just callreset_queries(), like this:

from django import db
db.reset_queries()

相關推薦

python-Django 記憶體洩露問題

一、python有自動垃圾回收機制(當物件的引用計數為零時直譯器會自動釋放記憶體),出現記憶體洩露的場景一般是擴充套件庫記憶體洩露或者迴圈引用(還有一種是全域性容器裡的物件沒有刪除) 前者無需討論,後者舉例如下(Obj('B')和Obj('C')的記憶體沒有回收)(貌似

使用 GC、Objgraph 幹掉 Python 記憶體洩露與迴圈引用

Python使用引用計數和垃圾回收來做記憶體管理,前面也寫過一遍文章《Python記憶體優化》,介紹了在python中,如何profile記憶體使用情況,並做出相應的優化。本文介紹兩個更致命的問題:記憶體洩露與迴圈引用。記憶體洩露是讓所有程式設計師都聞風喪膽的問題,輕則導致程式執行速度減慢,重則導致

Python垃圾回收與記憶體洩露

    Python是面向物件、高階程式語言,其世界裡萬物皆物件,當我們編寫的程式執行時,程式碼中定義的物件在實體記憶體中會佔用相應的空間。現在流行的高階語言如Java,C#等都採用了垃圾收集機制自動管理記憶體使用,而不像C,C++需要使用者自己分配、釋放記憶體。自己管理記憶

使用 GC、Objgraph 幹掉 Python 記憶體洩露與迴圈引用!

Python使用引用計數和垃圾回收來做記憶體管理,前面也寫過一遍文章《Python記憶體優化》,介紹了在python中,如何profile記憶體使用情況,並做出相應的優化。本文介紹兩個更致命的問題:記憶體洩露與迴圈引用。記憶體洩露是讓所有程式設計師都聞風喪膽的問題,輕則導致程式

python+multiprocess+theano+pylucene--記憶體洩露解決方案

最近上的專案有TPS要求,序列程式碼不滿足當前需求,需要改成多執行緒,就查了下Python的多執行緒,不查不知道,一查嚇一跳. 第一,Python是一種動態語言,我的理解是,執行到某一行的時候,才是知道編譯成機器碼,而不行C、JAVA等 靜態語言那樣事先編譯好再執行,這有一

【轉載】關於Python混合程式設計時的記憶體洩露

       登陸論壇  | 論壇註冊| 加入收藏 | 設為首頁| RSS      首頁Linux頻道軟體下載開發語言嵌入式頻道開源論壇 | php | JSP | ASP | asp.net | JAVA | c/c++/c# | perl | JavaScrip

python記憶體洩露

一、python有自動垃圾回收機制(當物件的引用計數為零時直譯器會自動釋放記憶體),出現記憶體洩露的場景一般是擴充套件庫記憶體洩露或者迴圈引用(還有一種是全域性容器裡的物件沒有刪除) 前者無需討論,後者舉例如下(Obj('B')和Obj('C')的記憶體沒有回收)(貌似迴圈

Python+Django+SAE系列教程7-----在Sae上配置Django

說明 water 系列教程 font cati 代碼 目錄 教程 本地 本章的開始首先我們來註冊一個sae賬號,首先登錄http://sae.sina.com.cn/。進入登錄頁面,這裏須要一個新浪微博賬號進行註冊。假設沒有趕快去註冊一個吧。 登錄平臺後。會提示一

Python+Django+js+echarts引入本地js文件的操作方法

div com log asc run 避免 repl mage script 1. 選擇正確的echarts.js,開發版選擇echarts.baidu.com上的源碼版,避免出現問題 2. 在項目主目錄中新建static文件夾,裏面建立js、css、images文件夾

python Django知識點總結

als 數據行 刪除命令 年齡 cdb resp 之前 false word python Django知識點總結 一、Django創建項目: CMD 終端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令:

Python Django開發中XSS內容過濾問題的解決

text .com trunk ecs mixed res on() body not from:http://stackoverflow.com/questions/699468/python-html-sanitizer-scrubber-filter 通過下面這個代

python Django之Ajax

truct some 代碼 click htm proc url spa file python Django之Ajax AJAX,Asynchronous JavaScript and XML (異步的JavaScript和XML),一種創建交互式網頁應用的網頁開發技術方

python-django備忘

ber clas -i api b- mode 表數 主鍵 目的 Django 模型 Django 對各種數據庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。 Django 為這些數據庫提供了統一的調用API。 我們可以根據自己業務需

python django添加靜態資源

django靜態資源在setting中確認以下:STATIC_URL = ‘/static/‘將靜態目錄放到app下,在app中創建static目錄,然後再創建css、js、image。在html中添加靜態資源的路徑: {% load staticfiles %} <link rel="styles

python django -2

進行 txt meta html模板 password ack 創建索引 list fault ORM簡介 MVC框架中包括一個重要的部分,就是ORM,它實現了數據模型與數據庫的解耦,即數據模型的設計不需要依賴於特定的數據庫,通過簡單的配置就可以輕松更換數據庫 OR

python django -7 Git與項目

inf 不同 lin 暫時 https sudo git倉庫 推送 esc git的使用,主要包括: 本地倉庫的命令 遠程倉庫的命令 項目需求、頁面、模型類的設計,及頁面的使用 Git簡介 Git是目前世界上最先進的分布式版本控制系統 安裝 sudo apt-

python django -5 進階

內容 search pic super dex this ava 搜索框 框架 高級知識點包括: 靜態文件處理 中間件 上傳圖片 Admin站點 分頁 使用jquery完成ajax 管理靜態文件 項目中的CSS、圖片、js都是靜態文件 配置靜態文件 在settin

python django 站點管理 配置mysql數據庫

各種功能 mysql manage 編輯 ont code min sqlit migration 運行命令mysql -uroot -p進入mysql 新建一個數據庫mydatabase 在/mysite/mysite目錄下 編輯settings.py文件: 默認數據庫為

ubuntu+apache+python+django部署

安裝 虛擬 pip3 虛擬環境 rtu 刪掉 無法訪問 err ngs  由於任務需要,在公司服務器部署的nginx+django服務要在阿裏雲上也部署一份,防止因公司斷網兒服務無法訪問;阿裏雲是ubuntu14.04+apache2.4的環境,需要安裝需要的環境加以部署。

python----django

admin log 環境變量 span 默認 spa images 程序 pla 1.django的MTV模型 URL:url的路徑與視圖函數的映射關系。 views:邏輯處理 models:與數據庫的相關操作 template:與html