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で繋げてるときだけとは思わなくて時間無駄にしちゃったなぁ。