- PR -

GCについての質問

1
投稿者投稿内容
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-12-23 11:47
例えば、下記のようなクラスBがあり
public class Cls_B {
 String strB = "BBB";
}

下記のように、クラスAの中でクラスBのオブジェクトを作成しています。
クラスAでは
"getStr()"でクラスBの変数を参照しています。
"bye()"でクラスBをNullとしています。
public class Cls_A {
 String strA;
 Cls_B clsB = new Cls_B();

 void getStr(){
  strA = clsB.strB;
 }

 void bye(){
  clsB = null;
 }
}

長々書きましたが、クラスAの"bye()"メソッドを発行しても、"getStr()"メソッドで
クラスBを参照しているのでGCの対象にはなりませんか?
sweetlove
会議室デビュー日: 2003/12/23
投稿数: 9
投稿日時: 2003-12-23 12:27
これはオブジェクトがオブジェクトをどう参照しているか、を考えたらわかります。

まず、Cls_Bをnewした際には

'Cls_B.strBは"BBB"を参照している'

という状態になります。
次にCls_Aをnewし、その後、getStr()を呼んだときにはこうなります。

'Cls_B.strBは"BBB"を参照している'
'Cls_A.clsBはCls_Bのインスタンスを参照している'
'Cls_A.strAは"BBB"を参照している'

ここで、最後の'Cls_A.strAは"BBB"を参照している'の理解は結構重要です。getStr()はclsBのstrBをstrAに割り当てているのではなく、clsBのstrBが参照している"BBB"をstrAに割り当てています。

では、byte()を実行するとこうなります。

'Cls_B.strBは"BBB"を参照している'
'Cls_A.strAは"BBB"を参照している'

したがって、ここで、Cls_Bのインスタンス(=Cls_A.clsBの参照するCls_Bのインスタンス)はGC対象になります。

わかりますか?
ボム
ベテラン
会議室デビュー日: 2003/07/25
投稿数: 61
投稿日時: 2003-12-23 16:31
sweetloveさん、ありがとうございました。

多分、理解できたと思います
つまり、もしもCls_Aの中の別の場所(getStr()以外)で"BBB"を参照していたら
void bye(){
 clsB = null;
}
を行ってもclsBはGCの対象にはならないのですよね?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-12-23 20:02
引用:

ボムさんの書き込み (2003-12-23 16:31) より:
つまり、もしもCls_Aの中の別の場所(getStr()以外)で"BBB"を参照していたら
void bye(){
 clsB = null;
}
を行ってもclsBはGCの対象にはならないのですよね?



いいえ。"BBB"はGCの対象になりませんが、clsBが参照していたオブジェクトはGCの対象に
なります。これは、"BBB"とclsBを間違えただけでしょうか? そうでないのなら、もう一度
sweetloveさんの書き込みを読んだほうがいいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)