ThreadとDebuggerとMemory Leakの関係

 AndroidでThreadを使ったプログラムを組んでまして、DDMSを使って確認してたら微妙にleakしてるっぽい。最終的にはアプリの問題ではなかったんですが、すげー悩んだのでその覚え書き。

 Heapをdumpして確認するとWeakHashMapに登録されているThreadが確かにGCで回収されてない。

 名前からしてWeakReferenceだと思うので通常他からの参照が無くなれば自動的にGCが回収するはずだけど、はて、、、? Threadは関数内のローカル変数にしてるので参照が残るわけないし、inner classの暗黙の参照とかも無し。WeakHashMapの解放もテストする範囲ではうまくいくし、なんでじゃろ?

 となやみ続けて数時間。いろいろ調べた結果。Debuggerで接続していると(恐らくDebuggerからの)Threadへの参照が無くならず、この現象が発生していることが判明、、、orz

試しにDDMSで繋げてると盛大にleakするプログラムを普通に走らせてからdebuggerにattachするとまったく問題なくGCで回収できてる。


 Threadが関係してMemory Leakが疑われる状態では、debuggerをattachせずに状態を作ってheap dumpして調査がいいのかも。さすがにdebuggerで繋げてるときだけとは思わなくて時間無駄にしちゃったなぁ。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.