Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

GCの対象

例えばTestオブジェクトがあり、TestオブジェクトのメンバーにオブジェクトAとオブジェクトAの変数を利用して作成したオブジェクトBがあります。
class Test{
    volatile Hoge hogea;
    final Hoge hogeb;←これはhogeaが持つ変数を利用して作成されている。
    Test(Hoge hogea){
        this.hogea=hogea;
        hogeb=HogebSakusei.getHogeb(hogea);
     }
}
new Test()の後にhogeaにnullを入れたらTestはGCの対象になりますか?

5

回答

175

閲覧

5件の回答

評価

0

TestがGCの対象になるのは、Test自身の参照がなくなったときだ。

評価

0

回答ありがとうございます。コンストラクタの引数に渡されたhogeaはGCの対象になりますか?
hogeaがGCの対象になってもそれを保持しているTestはGCの対象にならないのでしょうか?
それともTestがGCの対象にならないとhogeaにnullを入れてもhogeaはGCの対象にならないですか?

評価

0

class Hoge{
    private String st=null;
}
Hoge hoge=new Hoge();
例えば上記のようなどこからも使用できないhogeを作成しても、
hoge=nullとしないとGCの対象にならないのでしょうか?

評価

0

うーん、なんだろうな。
GCが対象とするのは「変数の指し示す(参照する)オブジェクト」であって「変数」ではない、というあたりだろうか。

最初の質問に戻って。
>new Test()の後にhogeaにnullを入れたらTestはGCの対象になりますか?
TestとHogeのインスタンスをそれぞれXとYとして。
結論から言うと、XとYのGCタイミングは直接関係がない。

Test a = new Test(hogehoge); // hogeaの指し示すXはhogehogeの指し示すオブジェクト

例えばaがローカル変数の場合、何事もなければメソッドを終了したときまたはa = nullとしたとき、XがGCの対象になる。
return aなら呼び出したメソッドがXへの参照を得るので、呼び出したメソッドのマターとなる。
(これは2018-03-20 22:21:24の回答になるだろう)
Xに対する参照がなくなればXはGCの対象になる。一方hogeaの指し示すオブジェクト、つまりYがGCの対象となるかは決定できない。
Yは元々hogehogeという変数から参照されていたため、hogehogeがどう使われているか分からないから。
hogea = nullとしたところで、XはおろかYもGCの対象になるかは決定できない。
それぞれどこから参照されているか分からないから。

評価

0

訂正
>// hogeaの指し示すXはhogehogeの指し示すオブジェクト
// hogeaの指し示すYはhogehogeの指し示すオブジェクト

回答する

ログインしていません。

ログインしなくても回答はできますが、ログインすると、質問・回答の管理、更新があった場合のメールでの通知を受けることができます。 アカウントをお持ちでない方は会員登録を行ってください。

ユーザ名匿名