こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JAVAにおけるメモリリーク

クラスAの中でクラスBがnewされているとき、
クラスAの参照をnull にセットしさえすれば、
内包されているクラスBに確保したメモリも即時に解放されるのでしょうか?
それともガーベジコレクションにてどこからも参照されていないことがわかった時点で解放されるのでしょうか?
はたまた解放されないのでしょうか?

ClassA
{

 ClassB instanceX = new ClassB();

}

- - - - - - - - - - - - - - - - - - - - - - - -

new をした際、そのメソッドの最後や、
Exceptionのキャッチ後のthrow前に、
変数 = null;
は書いていますが、
これ以外ではどういう点に気をつければ良いかがわかっていません。

どういうときにJavaでメモリリークが起こるのでしょうか?

投稿日時 - 2015-04-02 01:27:59

QNo.8947480

困ってます

質問者が選んだベストアンサー

>クラスAの参照をnull にセットしさえすれば、
>内包されているクラスBに確保したメモリも即時に解放されるのでしょうか?

まずクラスAもnullをセットしたとしても即時に開放される事はありません。
クラスAも同様に「どこからも参照されていない」状態になった時にGC(ガベージコレクション)の対象になるという事になります。
正確にいえば、参照の有無というよりはそのメモリ領域に対して到達可能かどうかです。
従ってクラスBにnullセットしなくてもクラスA自体が到達不能になり、クラスBの参照がAからしか参照されない場合、クラスBも同様に到達不能なので、GC対象です

また変数にnullをセットするnullクリアについてですが、すごーく昔のjavaではnullセットする事でGCが早くなるというTipsはありましたが、これはもう現在では通用しません。
nullセットするコストの方が無駄なので、nullセットは推奨されません。
GUIなど参照が複雑なケースでのnullによる明示的な参照オフが必要な場合は除いて、バッドノウハウなので気をつけましょう

>どういうときにJavaでメモリリークが起こるのでしょうか?
到達可能な状態でインスタンスを沢山保持してしまった場合です。
例えばクラスAはずっと使うが、内包するクラスBは一時的にしか使用しない場合、クラスBを使用しなくなった時点で参照を切らないと、クラスBはいつまでも使用しないにも関わらずGCされないという事です。
こういう例では明示的にnullクリアする必要があります

投稿日時 - 2015-04-10 19:34:59

お礼

> 例えばクラスAはずっと使うが、
> 内包するクラスBは一時的にしか使用しない場合、
> クラスBを使用しなくなった時点で参照を切らないと、
> クラスBはいつまでも使用しないにも関わらずGCされないという事です。
> こういう例では明示的にnullクリアする必要があります

ありがとうございます。
このケースを意識しておこうと思います。

投稿日時 - 2015-04-15 00:23:36

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ガーベジコレクションの挙動はOSや処理系におまかせなので
いつ、どういうタイミングで動くかわかりません。

OSによってできない場合もありますので。

投稿日時 - 2015-04-02 09:13:16

お礼

なるほどです。
ありがとうございます。

投稿日時 - 2015-04-15 00:24:02

ANo.1

>クラスAの参照をnull にセットしさえすれば、
>内包されているクラスBに確保したメモリも即時に解放されるのでしょうか?
>それともガーベジコレクションにてどこからも参照されていないことがわかった時点で解放されるのでしょうか?

後者です。

>new をした際、そのメソッドの最後や、
>Exceptionのキャッチ後のthrow前に、
>変数 = null;
>は書いていますが、

やる必要はありません。

>どういうときにJavaでメモリリークが起こるのでしょうか?

不要なオブジェクトがどこからか参照されてるような場合くらいでしょうか。

投稿日時 - 2015-04-02 02:59:00

お礼

ありがとうございます。
安心できました!

投稿日時 - 2015-04-15 00:20:32

あなたにオススメの質問