回答編集履歴

3 スレッドとweakrefについて追記

umyu

umyu score 5738

2018/04/15 23:25  投稿

Pythonではないですが、3年前に別言語でメモリリークの調査をした時の手順を。
今ならもっといい手法がある気がしますが。。
1,対象のObject自身が自身が関数呼び出しでメモリリークをおこなさない事を保証する。
まずそのObject自体は外部リソース(file/network/database)を使っていますか?
まずそのObject自体は外部リソース(file/network/database/thread)を使っていますか?
使っているならwith文や`contextlib.closing`を使った形にして確実に解放される形に変更してくださいな。
2,調査について
オブジェクト生成時に以下の情報をインスタンス変数に保持しておき調査情報としておきました。
2-1,実行スタックフレーム
 [tracebackモジュール](https://docs.python.jp/3/library/traceback.html)が使える気がします。
2-2,生成時間(ミリ秒単位)
ログファイルとの突合せ用。
2-3,コンストラクタ引数のパラメータをhash値化したもの。
3,経験則だと
3-1,コンテナやイベントリスナに追加したまま削除せずに放置でメモリリークになるパターンがあります。
=> 弱参照[weakref](https://docs.python.jp/3/library/weakref.html)を使うことも検討してみてくださいな。  
3-2,単純にGCがまだ実行されていないだけという事もあるので、GC.Collect()しても徐々にメモリが増加する特微が出るか確認してくださいな。
2 追記

umyu

umyu score 5738

2018/04/15 12:04  投稿

Pythonではないですが、3年前に別言語でメモリリークの調査をした時の手順を。
今ならもっといい手法がある気がしますが。。
1,対象のObject自身が自身が関数呼び出しでメモリリークをおこなさない事を保証する。
まずそのObject自体は外部リソース(file/network/database)を使っていますか?
使っているならwith文や`contextlib.closing`を使った形にして確実に解放される形に変更してくださいな。
2,調査について
オブジェクト生成時に以下の情報をインスタンス変数に保持しておき調査情報としておきました。
2-1,実行スタックフレーム
 [tracebackモジュール](https://docs.python.jp/3/library/traceback.html)が使える気がします。
2-2,生成時間(ミリ秒単位)
ログファイルとの突合せ用。
2-3,コンストラクタ引数のパラメータをhash値化したもの。
3,経験則だと
1,コンテナやイベントリスナに追加したまま削除せずに放置でメモリリークになるパターンがあります。
2,単純にGCがまだ実行されていないだけという事もあるので、GC.Collect()しても徐々にメモリが増加する特微が出るか確認してくださいな。
3-1,コンテナやイベントリスナに追加したまま削除せずに放置でメモリリークになるパターンがあります。
3-2,単純にGCがまだ実行されていないだけという事もあるので、GC.Collect()しても徐々にメモリが増加する特微が出るか確認してくださいな。
1 追記

umyu

umyu score 5738

2018/04/15 12:03  投稿

Pythonではないですが、3年前に別言語でメモリリークの調査をした時の手順を。
今ならもっといい手法がある気がしますが。。
1,対象のObject自身が自身が関数呼び出しでメモリリークをおこなさない事を保証する。
まずそのObject自体は外部リソース(file/network/database)を使っていますか?
使っているならwith文や`contextlib.closing`を使った形にして確実に解放される形に変更してくださいな。
2,調査について
オブジェクト生成時に以下の情報をインスタンス変数に保持しておき調査情報としておきました。
2-1,実行スタックフレーム
 [tracebackモジュール](https://docs.python.jp/3/library/traceback.html)が使える気がします。
2-2,生成時間(ミリ秒単位)
ログファイルとの突合せ用。
2-3,コンストラクタ引数のパラメータをhash値化したもの。
3,経験則だと
コンテナやイベントリスナに追加したまま削除せずに放置でメモリリークになるパターンがあります。
1,コンテナやイベントリスナに追加したまま削除せずに放置でメモリリークになるパターンがあります。
2,単純にGCがまだ実行されていないだけという事もあるので、GC.Collect()しても徐々にメモリが増加する特微が出るか確認してくださいな。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る