<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一般情況下只有需要長期執行的專案才會去關注記憶體的增長情況,即使是很小部分的記憶體洩露經過長期的執行仍然會產生很大的隱患。
python本身也是支援垃圾的自動回收的,但是在特定的情況下也是會出現記憶體洩露的問題的。
比如對於很多全域性的列表(list)/字典(dict)等物件在經過不斷的資料賦值而沒有進行手動回收,或者某些物件被不停的迴圈參照而不能及時的進行回收等都會產生記憶體洩露的情況。
一般在python程式碼塊的偵錯過程中會使用memory-profiler、filprofiler、objgraph等三種方式進行輔助分析,今天這裡主要介紹使用objgraph物件提供的函數介面來進行記憶體洩露的分析。
objgraph是python的非標準模組,因此需要使用pip的方式安裝一下。
pip install objgraph
更多詳細的介紹可以存取下面的官方地址進行檢視。
接下來就可以直接將objgraph匯入到我們的程式碼塊中進行使用了。
# Importing the objgraph module and renaming it to graph. import objgraph as graph
這裡初始化一組字典型別的資料物件。
dict_ = { '姓名': ['Python', 'Java', 'Scala'], '年齡': ['21', '22', '19'] }
通過objgraph.count()函數,可以統計出GC中的dict_物件的數目是多少。
# Counting the number of dict_ objects in the GC. print(graph.count(dict_))
和objgraph.count()函數對應的是可以使用by_type返回該物件在GC中的列表,若是GC返回的為空的列表說明已經被回收了。
# Returning a list of dict_ objects in the GC. print(graph.by_type(dict_))
在統計記憶體洩露時比較好用的函數就是graph.show_growth()函數,可以統計自上次呼叫以來增加得最多的物件。
# Showing the growth of objects in the memory since the last time it was called. print(graph.show_growth()) # function 3013 +3013 # tuple 1463 +1463 # dict 1417 +1417 # wrapper_descriptor 1178 +1178 # ReferenceType 883 +883 # method_descriptor 814 +814 # builtin_function_or_method 794 +794 # getset_descriptor 514 +514 # type 463 +463 # list 436 +436 # None
可以根據返回結果中的物件每次增加的數量來判斷記憶體洩露的相關情況。
還有一個比較常用的分析函數就是graph.show_most_common_types(),可以按照從大到小的方式列出物件範例比較多的情況。
# Showing the most common types of objects in the memory. print(graph.show_most_common_types()) # function 3013 # tuple 1463 # dict 1417 # wrapper_descriptor 1178 # ReferenceType 883 # method_descriptor 814 # builtin_function_or_method 794 # getset_descriptor 514 # type 463 # list 436 # None
最後一個比較使用函數就是show_backrefs函數,使用它可以分析出記憶體洩露的原因是什麼。
它會生成一張有關objs的參照圖,可以看出物件為什麼不釋放?只是呼叫該函數時的引數比較多,下面是該函數的介面。
# def show_backrefs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10, # highlight=None, filename=None, extra_info=None, # refcounts=False, shortnames=True, output=None, # extra_node_attrs=None):
我們還是和上面一樣使用dict_作為物件進行分析。
# Showing the back references of the dict_ object. graph.show_backrefs(dict_)
執行完成後dot型別的圖片已經生成了,發現出現了下面的錯誤,意思是沒有發現支援dot的影象元件。
# Graph written to C:Users86159AppDataLocalTempobjgraph-dkqm85f0.dot (4 nodes) # Graph viewer (xdot) and image renderer (dot) not found, not doing anything else
可以使用pip的方式分別安裝graphviz xdot,這兩個python的非標準模組。
pip install graphviz xdot
若是檢視.dot決策樹影象可以使用graphviz工具,可以到下面地址進行下載安裝。
https://graphviz.org/download/
安裝完成後設定環境變數,然後重啟開發工具(這裡使用的是pycharm)即可。
到此這篇關於Python實現記憶體洩露排查的範例詳解的文章就介紹到這了,更多相關Python記憶體洩露排查內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45