2

OCJPの勉強中に、次の質問に出くわしました。

class CardBoard {
           Short story = 200;
           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 
}}

// doStuffに到達すると、GCに適格なオブジェクトはいくつありますか?
正解は2、意味c1とそのstory目的です。

行//doStuffに達すると、c3もnullになります。なぜGCにも適格ではないのですか?

4

6 に答える 6

5

c3 は、null 参照を持つローカル ハンドルであり、割り当てられたオブジェクトを指していません (そして、まだ指し示しています)。したがって、GC には何もありません。

于 2012-10-28T14:38:21.170 に答える
1

ガベージコレクタはメモリ内のオブジェクトをスキャンし、それを指しているハンドルをチェックします(その逆ではありません)。ガベージコレクタが呼び出されると、オブジェクトを指しているハンドルがないオブジェクト(メモリ内)がメモリから削除されます。このコードの場合、メモリ内に作成されるオブジェクトは2つだけですが、ハンドルは3つです。ガベージコレクターは最大2つのオブジェクトのみを削除します(2つのオブジェクトのみが存在するため)C3はヌル位置のみを指していました。C1、C2、C3は削除されません。それらが指し示していたオブジェクトは削除されます(他のハンドルがそれらを指し示していない場合)。したがって、この時点では、C3がメモリ内のオブジェクトをポイントしていないため、オブジェクトをnullに設定しても、ガベージコレクターに違いはありません。

お役に立てば幸いです

于 2012-10-28T14:43:03.897 に答える
1

c3はオブジェクトではありません。nullを参照する変数です。変数を GC の対象にすることはできません。オブジェクトのみが GC の対象となります。

GC の対象となるオブジェクトは、 によって最初に参照された Cardboardc1と、 によって最初に参照された CardBoard によって最初に参照された Short インスタンスc1です。

于 2012-10-28T14:38:19.113 に答える
0

あなたのCardBoard#go()方法は何もしません。あるオブジェクトへの参照を受け取り、すぐにそれを忘れて、に置き換え、この値nullを返します。null

だから、ライン

CardBoard c3 = c1.go(c2);

また、何もしません。つまり、オブジェクトは作成されません。に割り当てられたnullだけc3。したがって、ガベージコレクションはまだ存在しないため、ガベージコレクションされません。

于 2012-10-28T14:43:55.040 に答える
0

c3自体は単なる参照変数であり、ヒープ領域にはありません(つまり、ガベージ コレクションの範囲にはありません)。

CardBoard c3 = c1.go(c2);は c3 参照を null に設定するだけなので、c3 はオブジェクトを適格にしないため、ガベージ コレクションに影響しません。

于 2017-12-22T01:04:21.203 に答える