- - PR -
GCについての質問
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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の対象にはなりませんか? | ||||
|
投稿日時: 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-12-23 16:31
sweetloveさん、ありがとうございました。
多分、理解できたと思います つまり、もしもCls_Aの中の別の場所(getStr()以外)で"BBB"を参照していたら void bye(){ clsB = null; } を行ってもclsBはGCの対象にはならないのですよね? | ||||
|
投稿日時: 2003-12-23 20:02
いいえ。"BBB"はGCの対象になりませんが、clsBが参照していたオブジェクトはGCの対象に なります。これは、"BBB"とclsBを間違えただけでしょうか? そうでないのなら、もう一度 sweetloveさんの書き込みを読んだほうがいいと思います。 | ||||
1
