インスタンスの解放について

465 views
Skip to first unread message

三宅義之

unread,
Oct 3, 2013, 3:34:16 AM10/3/13
to android-g...@googlegroups.com
いつもお世話になっております。

ご教授願いたく。


インスタンスの解放についてご教授願いたく存じます。
プログラム上でnewしたクラスはonDestroy()するべきでしょうか?
基本的な質問となりますが、ご教授のほど、宜しくお願い致します。


【例1】

private Button mBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBtn = new Button(this);
}

@Override
protected void onDestroy() {
super.onDestroy();
//そのまま死ぬ
}


【例2】

private Button mBtn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBtn = new Button(this);
}

@Override
protected void onDestroy() {
super.onDestroy();
//明示的に解放する(?)
mBtn = null;
}

Hirokazu Fukami

unread,
Oct 3, 2013, 3:42:07 AM10/3/13
to android-g...@googlegroups.com
こんにちはfkmです。

10年ほど前の記事ではありますが、ここの「メモリ解放の仕組み」が
参考になると思います。
http://www.atmarkit.co.jp/ait/articles/0404/02/news079.html

この場合、Activityインスタンスが「ルート集合」から外れたとき、
メンバ変数のButtonも一緒に解放の対象となります。

ちなみに、onDestroy()は必ず呼ばれるとは限らないので
注意が必要です。


2013/10/3 三宅義之 <gagaha...@yahoo.co.jp>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

Hiroaki GOTO as GORRY

unread,
Oct 3, 2013, 4:27:14 AM10/3/13
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

> ちなみに、onDestroy()は必ず呼ばれるとは限らないので
> 注意が必要です。

「onDestroy()が呼ばれないケース」=「プロセスがkillされた」と
いうことなので、newしたオブジェクトの行く末を気にする必要は
もはやないかと思います。

「onDestroy()で解放すべきもの」=「onCreate()内で確保した、
GCでは解放されないもの」と考えておけばよいかと思います。
実質的にはごく一部のもの(Bitmap系とかサウンド系とかView系とか)しか
ないかと思いますが。


In message <CAN8EOVsKTMxJ6-9VjHmpksjC...@mail.gmail.com>
"Re: [android-group-japan: 24792] インスタンスの解放について"
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

三宅義之

unread,
Oct 3, 2013, 7:37:16 AM10/3/13
to android-g...@googlegroups.com
深見様、後藤様


ご回答有難うございます。

もう一点、ご教授頂きたく存じます。
Androidアプリ作成時、GCやメモリ解放について具体的に
何を意識して、どのようにプログラミングされてますでしょうか?





2013年10月3日木曜日 17時27分14秒 UTC+9 GORRY:

後藤 浩昭(GORRY)です。

> ちなみに、onDestroy()は必ず呼ばれるとは限らないので
> 注意が必要です。

「onDestroy()が呼ばれないケース」=「プロセスがkillされた」と
いうことなので、newしたオブジェクトの行く末を気にする必要は
もはやないかと思います。

「onDestroy()で解放すべきもの」=「onCreate()内で確保した、
GCでは解放されないもの」と考えておけばよいかと思います。
実質的にはごく一部のもの(Bitmap系とかサウンド系とかView系とか)しか
ないかと思いますが。


>> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com
>> にメールを送信します。
>> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
>> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
>> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>
>
> --
> -------------------------------------------------------------
> 深見 浩和(Hirokazu Fukami)
>
> URI:http://www.fkmsoft.jp
> email: f...@fkmsoft.jp
>
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信します。
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。

Shigeo Mutoh

unread,
Oct 3, 2013, 9:00:45 AM10/3/13
to android-g...@googlegroups.com
武藤です。

横から失礼します。

正直、ほとんど気にしていない、いや気にする必要がないと言ってもいいと思います。
ただ、GCはすごいマジックではないので、GC処理の負担を減らすよう努力する
必要はあります。たとえばやたらとnewしまくって、ぽいぽい捨てるようなことをすると、
GCはその名の通り「ガーベージ・コレクション」ですからコレクションするのが大変
になります。限界を超えるほとゴミが増えたとき、UIが一瞬止まってしまいます。

ただ、GCは賢くて、なるべく本業の妨げにならないよう、裏でちょいちょいGCしています
からほとんど気にする必要はありません。

結局、どんな言語でも共通だと思いますが、メモリ確保の処理コストは十分に高い
わけですから、なるべくnewしない、無駄なnewはしない、なるべく持たない、
ということだけかと思います。

三宅義之

unread,
Oct 7, 2013, 3:13:09 AM10/7/13
to android-g...@googlegroups.com
武藤様
皆様

返信遅くなりました。

アドバイス有難うございました。
注意して実装を進めたいと思います。
ご迷惑だとは思うのですが、ここで更に知識を深めさせていただきたく。

色々調べたのですが、bitmapやviewは明示的に適宜、解放したほうが良いと分かりました。

しかしながら、システムキルされた場合は、onDestroy()が走らないので適宜、解放は難しくなります。
結果的にbitmapやviewのゴミが残り、何れは「out of memory」が発生することとなります。
もちろん、システムキルされるような作りにするのが悪いのですが、アプリ側で何か対応を入れることは
可能でしょうか?例えばアプリ側でシステムキルイベントを受信することは可能でしょうか?

GCについてですが、例えばAアプリがGC発生トリガーを引いた場合、同時に動作(バックグラウンド等で)しているBアプリに影響は及ぼすでしょうか?

お忙しいとは思われますが、ご教授の程、宜しくお願い致します。



2013年10月3日木曜日 22時00分45秒 UTC+9 TM:

Makoto Yamazaki

unread,
Oct 7, 2013, 3:18:28 AM10/7/13
to android-g...@googlegroups.com
zaki です。

プロセスが殺される場合はプロセスが使っていたメモリはまるごと開放されるので
自分で new したインスタンスや Bitmap に関して心配する必要はありません。



2013/10/7 三宅義之 <gagaha...@yahoo.co.jp>

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
YAMAZAKI Makoto

Shigeo Mutoh

unread,
Oct 7, 2013, 6:31:45 AM10/7/13
to android-g...@googlegroups.com
武藤です。

ここまで来ると、Linuxをたくみに使ったAndroidの実装について詳しく調査してみる
と面白いと思います。またAndroidのJava VMであるDalvikの挙動についてです。

簡単に書いておくと、AndroidではJava VMはアプリごとに独立しています。
なので、アプリが死ぬときにはJava VMもろとも死ぬわけですから、他のプロセス
に影響しません。これがfinalizationを端折れる理由です。というか、それが本質的
な意図だと思います。

また、Dalvikの挙動も面白いです。こいつはメモリ領域の引越し(compaction)をしません。
なのでメモリは比較的簡単に枯渇しますが高速です。

何をするとどうなるかではなくて、何がどうなっているかを調べた方が良いです。

ではご健闘をお祈りします。

三宅義之

unread,
Oct 8, 2013, 10:00:30 PM10/8/13
to android-g...@googlegroups.com
武藤様
皆様

お忙しいなか、有難うございました。
AOSPのソースをダウンロードし、他のエントリーを参考にソースをみてみました。。。。
正直言って全くもって不明でした。

今後も精進するということで、このスレを終了とさせて頂きます。

以上、宜しくお願い致します。

2013年10月7日月曜日 19時31分45秒 UTC+9 TM:

Shigeo Mutoh

unread,
Oct 9, 2013, 8:29:40 AM10/9/13
to android-g...@googlegroups.com
武藤です。

あらま、それはそれは...。さいごにちょっとだけ。
Zygoteとは何か? Dalvikとは何か? の概要を理解されればたぶんメモリに
関する謎はほとんど氷解すると思います。
では。

Reply all
Reply to author
Forward
0 new messages