objgraph による Python メモリリーク調査
[履歴] [最終更新] (2019/10/27 22:46:24)
最近の投稿
注目の記事

概要

メモリリーク時に JVM の jmapC/C++ の Valgrind で調査できるのと同様に、Python では objgraph が便利です。

sudo apt install graphviz
python -m pip install xdot
python -m pip install objgraph

タイプ毎にオブジェクト数を表示

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from objgraph import show_most_common_types

class MyBigFatObject(object):
    pass

def Main():
    obj = MyBigFatObject()
    show_most_common_types(limit=999)

if __name__ == '__main__':
    Main()

出力例

$ python sample.py | grep MyBigFatObject
MyBigFatObject             1

あるタイプのオブジェクト数を表示

#!/usr/bin/python
# -*- coding: utf-8 -*-

from objgraph import count

class MyBigFatObject(object):
    pass

def Main():
    obj = MyBigFatObject()
    print count('MyBigFatObject') #=> 1

if __name__ == '__main__':
    Main()

増加したオブジェクトを表示

最後に growth/show_growth した時点からの、オブジェクトの増加数を表示できます。

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from objgraph import growth
from objgraph import show_growth

class MyBigFatObject(object):
    pass

def Main():
    growth()
    growth()
    obj = MyBigFatObject()
    show_growth(limit=999)

if __name__ == '__main__':
    Main()

出力例

$ python sample.py
frame                 5        +1
MyBigFatObject        1        +1

オブジェクトの参照状況を可視化

sample.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

from objgraph import show_refs

class MyBigFatObject(object):
    pass

def Main():
    x = [1, {'mykey': 'myval'}]
    for i in range(2):
        x.append(MyBigFatObject())
    show_refs([x], filename='sample-graph.png')

if __name__ == '__main__':
    Main()

出力例

Uploaded Image

関連ページ