QA@IT

Javaでのスレッドの扱いについて

4718 PV

現在ボタンクリックのタイミングでHTTP通信を行うようなとあるAndroidアプリを製作しているのですが、DDMSでメモリ使用量を調べてみると、少しずつHeap Sizeが増え続けてしまいます。
(開始時に3M程度だったものが動かし続けると6M、7Mとどんどん増加していく状態です)
また、Eclipseのデバッグパースペクティブで確認すると、スレッドの数が増え続けており、
Thread.activeCount()にてスレッドのアクティブ数を調べてみると、こちらでも増え続ける一方なのですが、
この事象とHeap Size増加は関係があるのでしょうか?
スレッドについては、基本的に毎回Threadのインスタンスを作成し、
start()メソッドを呼び出していますが、このような利用の仕方では問題があるのでしょうか?

以上、よろしくお願いします。

回答

Threadのインスタンスが終了していないために、アクティブなThreadインスタンスが残ってしまうのだと考えられます。run()メソッド内で、例外が発生した場合などに、きちんと使っているリソースを解放して終了するようにプログラムを作ってあるか確認してみてはどうでしょうか。もしくは、Threadインスタンスが終了するときにログに何か出力をするようにして、確実に終わっているか確認してみてはどうでしょうか。

編集 履歴 (0)
  • ご返信頂きどうもありがとうございます。
    あれから色々と検証したところ、Thread内でHTTP通信を行わない状態であれば、Thread.activeCount()が増えないことから、HTTP通信部分の処理に問題がありそうなことがわかったのですが、まだ原因を特定できていない状態です。
    -
  • HTTP通信を行うと、Threadがwait状態になってしまうのですが、これはリソースの開放漏れなどが原因として考えられるのでしょうか? -
  • wait状態になるということは、Threadが途中で待機状態になるということなので、Threadインスタンスのリソースが解放されなくなるということになります。run()メソッドに無限ループを記述してたりしませんか。HTTP通信を1回しかしないのなら、必ずrun()メソッドが終了するように書く必要があります。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。