1

私は次のコードを持っています:

class Test {
   public static void main(String[] args) {
      String a,b,c;
      a = new String(args[0]);
      b = a;
      a = null;
      b = null;
   }
}

ガベージコレクションの対象となる時期を誰かに教えてもらえますか。aとbが同じオブジェクトを参照していないので、bがnullになった後だと思いますか?

4

5 に答える 5

1

作成したオブジェクト はnew String(args[0]);、参照がなくなるとコレクションの対象になります。それでは、コードをステップ実行しましょう。

a = new String(args[0]);

aがあなたの文字列を指している場合、コレクションの対象にはなりません。

b = a;

a対象外の文字列をb指します。

a = null;

bあなたの文字列を指していますが、適格ではありません。

b = null;

あなたの文字列への参照はありません。Garbage Colelctor は喜んでいます!

于 2012-06-21T17:11:47.423 に答える
1

私の答えも売り込みます。他の回答が言うように、 String/ オブジェクトは、アクセスできなくなるとガベージ コレクションで使用できるようになります (ハンドルがなくなります)。

したがって、一方向のリンクされたリストがあり、(以降へのハンドルを持つ) へのハンドル[1] -> [2] -> [3]があったとします。ハンドルをnull に設定すると、リスト全体がガベージ コレクターで使用できるようになります。この回答が示すように、System.gc() を呼び出してガベージ コレクターの実行を要求することはできますが、それが保証されるわけではありません。[1][2][1]

この回答の主な焦点は、オブジェクトにアクセスできないときにガベージコレクターがオブジェクトを使用できることであり、それは必ずしもオブジェクトへの参照がないことを意味するとは限りません。上記の例で[1]は、 へのハンドルがありましたが[2][2]へのハンドルがなかったため、ガベージ コレクターで使用できました[1]

于 2012-06-21T17:20:52.397 に答える
0
class Test {
   public static void main(String[] args) {
      String a,b,c; // you dont have objects yet
      a = new String(args[0]); // here u make a new object
      b = a; // b references to the same object as a
      a = null; // a points to null, reference is removed.
      b = null; // b point to null, reference is removed
   }
}

プログラムでは、作成されてaとbに割り当てられたオブジェクトは、参照が削除された後にガベージコレクションされます。

ガベージコレクターは、ルートがなく、何からも参照されていないオブジェクトをクリーンアップします。

于 2012-06-21T17:12:50.243 に答える
0

とはどういう意味aですか? a参照であり、オブジェクトのみがガベージ コレクションされます。

によって参照される文字列は、何も参照されなくなったときにガベージ コレクションの対象となりますabこの場合、これは、文字列への両方の参照 (aおよびb) が別のものを参照するように変更された後です。この場合、null.

于 2012-06-21T17:12:00.267 に答える
0

割り当てられたオブジェクトに関して推論する必要があります。 と の両方をString無効にすると、割り当てた は誰にも参照されません。その上で、ガベージ コレクターはその仕事をする権利があります。ab

于 2012-06-21T17:12:21.717 に答える