メモリリーク調査について

562 views
Skip to first unread message

takeshi_58

unread,
Dec 13, 2011, 6:29:39 AM12/13/11
to 日本Androidの会
いつも分からないことをROMさせていただいています。
takeshiと申します。

現在、Android2.2でアプリを開発を行っているのですが、
起動する毎にヒープメモリが増加していく状態に落ちいっております。
メモリリークが発生しているものと考えており、
Tracking Memory Allocationsツールを使って調査を行っているのですが、
分からない所があり、質問いたしました。

Histogramで、対象のActivityを表示した際に、下記のように表示されました。
(アクティビティ名→testActivity)
Class Name | Objects | Shallow
Heap | Retained Heap
-------------------------------------------------------------------------------------------
com.hoge.testActivity | 1 |
224 | >= 2,040
com.hoge.DatabaseHelper | 1 | 32
| >= 32
com.hoge.testActivity$2 | 1 |
32 | >= 32
com.hoge.testActivity$3 | 1 |
24 | >= 24
-------------------------------------------------------------------------------------------

com.hoge.testActivity$2やcom.hoge.testActivity$3について、
何を表しているのか分かりません。

タスクを表しているのかと思ったのですが、
起動時のIntentにはフラグは付けておらず、testActivityのマニフェストファイルには、
android:launchMode="singleTask" を設定しているため、
複数のタスクでは起動しないと考えております。

ご存知の方がおられましたら、ご教授いただけないでしょうか。

よろしくお願いいたします。

Message has been deleted

takeshi_58

unread,
Dec 16, 2011, 1:10:30 AM12/16/11
to 日本Androidの会
自己スレです。
「$」について内部クラスであることが分かりました。
知識不足を反省しております。

引き続き質問をさせていただきたいのですが、

AIDLを使いサービスとのバインド処理を行っているのですが、
画面を終了しても、
コールバックインターフェイス(ICallbackListener$Stud)
がActivityを掴んでいるようなのです。
2日ほど悩んでおりますが、開放方法が見つけられません。。
ご存知の方がおりましたら、
ご教授いただけないでしょうか。

下記のように実装しております。

※変数
private ICallbackListener mService = null;

※バインド
bindService(new Intent(ICallbackListener.class.getName()), connection,
Context.BIND_AUTO_CREATE);

※コールバックインターフェイス
private ICallbackListener listener = new ICallbackListener.Stub() {
public void receiveMessage(String message) throws RemoteException
{
handler.sendMessage(handler.obtainMessage(CALLBACK_MESSAGE,
message));
}
};

※コネクション
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder
service) {
mService = ICallbackListener.Stub.asInterface(service);
try {
mService.addListener(listener);
} catch (RemoteException e) {
}
}
public void onServiceDisconnected(ComponentName name) {
mService = null;
}
};

※onDestroy(開放)
try {
if(mService != null){
mService.removeListener(listener);
unbindService(connection);
mService = null;
connection = null;
listener = null;
}
} catch (RemoteException e) {

}

どうかよろしくお願いいたします。

トムキャット

unread,
Dec 16, 2011, 10:19:28 AM12/16/11
to 日本Androidの会
トムキャットです。

僕の場合、bindはonResumeで、unbindはonPauseでしています。bind/unbindはすぐに実行されず、完了まで時間がかか
ります。やったことがないので分かりませんが、onDestroyでunbindした場合、unbindが実際に終わるまでActivityは生きてい
るのでしょうか?それは大丈夫だとしても、onPauseでunbindする方が合理的だと思います。

takeshi_58

unread,
Dec 20, 2011, 1:53:51 AM12/20/11
to 日本Androidの会
takeshiです。

トムキャットさん
返信いただき、ありがとうございます。

onPauseで実装しようと思っていたのですが、
バックグラウンドにいる時もServiceと接続しておきたかった為、
onDestroyで実装しています。
でも確かに、Activityが生きている間に、
アンバインド処理が完了しているか分かりませんよね。。

結果的には、
ツールで確認するとインスタンスとしては残っていましたが、
DDMSで確認すると使用メモリ量が少なくなると、Allocatedは開放されているようでした。
(メモリリークは解消された?)

スッキリとはしませんでしたので、
onPauseにして確認を行ってみたいと思います。

ありがとうございました。

On 12月17日, 午前12:19, トムキャット <dailyti...@gmail.com> wrote:
> トムキャットです。
>
> 僕の場合、bindはonResumeで、unbindはonPauseでしています。bind/unbindはすぐに実行されず、完了まで時間がかか
> ります。やったことがないので分かりませんが、onDestroyでunbindした場合、unbindが実際に終わるまでActivityは生きてい
> るのでしょうか?それは大丈夫だとしても、onPauseでunbindする方が合理的だと思います。
>

Reply all
Reply to author
Forward
0 new messages