2

こんばんは、GC の対象となるオブジェクトの数を示す次のコード サンプルをご覧ください。

public 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

   }
}

do Stuff に到達したときに GC の対象となるオブジェクトが 4 つあります。それは c3 であり、それに関連付けられたストーリー オブジェクトであり、c1 であり、それに関連付けられたストーリー オブジェクトです。何が見えますか?

4

1 に答える 1

8

GC の対象となるオブジェクトは 1 つだけです。これは、以前に によって参照されたものですc1c3を指しますnull(CardBoard.go()常に を返しますnull)。

c1また、c2変数はオブジェクトではなく参照に過ぎないことも覚えておいてください。したがって、ガベージ コレクションを行う必要はありません。それらはヒープ上ではなく、スタック上に存在します。

最後に、だまされないでください:

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

cbこれは、参照ではなく、参照 (パラメーター) を無効にするだけc2です。


Short story = 5;

別の問題です。そうであれば、それはshort story別個のオブジェクトとしてカウントされません。ただしShort、オブジェクトであるため、技術的CardBoardには GC の対象となる別のオブジェクトを指しています。でも!プリミティブ ラッパーにより、キャッシング5は実際にはShort静的キャッシュの一部であり、実際には GC の対象にはなりません。つまり、Short表す型のオブジェクト5は、常にstaticキャッシュ内で参照されShortます。

ここが最高の部分です。それがあった場合:

Short story = 5000;

その場合、答えは... 2になります。これは、 (GC の対象となる)Short.valueOf((short)5000)の新しいインスタンスを常に返し、常に同じインスタンスを返すためです。ShortShort.valueOf(5)

うわー、それはトリッキーでした!

于 2013-01-12T18:55:28.430 に答える