2016-09-24 6 views
-1

この質問を理解しようとしていましたが、本の回答で解決できませんでした。誰かが私に説明することはできますか?質問は以下の通りです。メソッドの引数として渡され、nullに設定されているオブジェクトのガベージコレクション

class CardBoard { 
    Short story = 5; 

    CardBoard go(CardBoard cb) { 
    cb = null; 
    return cb; 
    } 

    public static void main(String[] args) { 
    CardBoard c1 = new CardBoard(); 
    CardBoard c2 = new CardBoard(); 
    CardBoard c3 = c1.go(c2); 
    c1 = null; 
    // do stuff 
    } 
} 

//は、ガベージコレクションの対象となりますどのように多くのオブジェクト、スタッフ達するないとき?

与えられた回答は2オブジェクトです。 1つのCardBoardオブジェクト(c1)のみが対象ですが、関連するショートラッパーオブジェクトもあります。

オブジェクトc1だけがガベージコレクションの対象となる理由を理解できません。

2つのオブジェクトが作成されます(c1とc2)。

オブジェクトc3の場合、c2をc1.go()メソッドに渡します。 nullに設定され、返されたオブジェクトはc3に割り当てられます。

メソッドc1.go()では、cbに渡すオブジェクト(c2に渡す同じオブジェクト)がnullに設定されます。 c2 refferingするオブジェクトをガベージコレクションの対象にすることはできませんか?

答えて

0

Javaはの値渡しです。 CardBoard c3 = c1.go(c2);を実行すると、c2が指し示すインスタンスはgo()に渡されますが、cb=nullを実行する瞬間には、元のc2's cbnullに設定されず、新しいヌル参照aconst_nullがスタックにプッシュされて戻されます。したがって、GCに適格なオブジェクトは2つしかありません(Shortおよびc1)。

PS:Andreasによると、Shortの値は-128と127の間の値でキャッシュされるため、同じ場合は同じShortインスタンスが再利用されます。したがって、1つのオブジェクトだけがGCに適格となります。 Shortの値がその範囲外の場合、2つのオブジェクトがGCの対象となります。

+0

私は参照変数のコピーがc1.go(c2)に渡され、それが参照変数cbにコピーされることを理解します。これらの2つの参照変数は、ヒープ内の同じオブジェクトにpoitingされませんか? –

+0

@AnjJo - はい、そうです。しかし 'cb = null'を実行すると、2番目の参照はもはや元のオブジェクトを指しません。 'null 'を指します。 – TheLostMind

+0

' cb'の参照のみが 'null'に設定されています。しかし、インスタンス変数を変更しようとすると、両方の参照変数が同じオブジェクトを参照することになります。それはあなたが正しいと言うことですか? –

0

Javaは値渡しですので、パラメータcbを無効にすると、変数c2の値は変更されません。

go()メソッドコールは、単にnullを返して終了し、c1c2は変更されません。

したがって、実行が// do stuffになると、c1はヌル、c2は第2のオブジェクトを参照し、c3はnullです。つまり、最初のオブジェクトはGCに適格です。


各オブジェクトはShort参照を持っているので、あなたは2つのオブジェクトが(最初のオブジェクトとそのstory)解放され、2つのオブジェクトが(第二の目的とそのstory)残ることを考えるだろう、しかしそれではありません本当にそう。

Shortの値は、Shortオブジェクトの新しいインスタンスを作成しません。 -128〜127(両端を含む)の値はキャッシュであり、キャッシュ値は永続的です。

これは、2つのオブジェクトしか割り当てられておらず、最初のオブジェクトがGCに適格であるということです。 Short story参照は何も割り当てません。

+0

はい。あなたは右の 'Short'フィールドはキャッシュされているのでGCedにならないはずです。しかし、コンセプトは賢明です(短い値がキャッシュから返されない場合)、OPはGCに適格な2つのオブジェクトで終わる可能性があります。 – TheLostMind

関連する問題