4

次のコードは、1 つの配列と 1 つの文字列オブジェクトを作成します。

今私の質問は

  1. コードの実行後にそれらのオブジェクトへの参照がいくつ存在するか?
  2. なんで?

これが私のコードです

String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;

答えは1つのオブジェクトだけだと思っていましたが、 Oracleのドキュメントstudents
に よると、Neither object is eligible for garbage collection

どのように答えを推測すればよいですか?

4

6 に答える 6

10

コードの実行後にそれらのオブジェクトへの参照がいくつ存在するか?

  • への 1 つの参照。String[]式 で取得できますstudents
  • への 1 つの参照。String式 で取得できますstudents[0]

なんで?

基本的に、答えは、変数ではなくオブジェクトがガベージ コレクションの対象になる可能性があるということです。

あなたの場合、文字列 (オブジェクト) の参照を配列の最初のスロットにコピーしました。初期変数をクリア ( に設定null) した後でも、同じオブジェクトがコードから別の名前で表示されます(ここでの「名前」とは、上記のように「式」を意味します)。これが、文字列がまだガベージ コレクションの対象にならない理由です。


比較のために、3 行目のないコードを検討してください。

String[] students = new String[10];
String studentName = "Peter Smith";
studentName = null;

このシナリオでは、文字列"Peter Smith"はどの式でも取得できなくなるため、期待どおりガベージ コレクションの対象となります。


(上記はすべて Java 言語に関するものであり、可能な JVM 最適化は脇に置いておきます。)

于 2013-06-02T13:22:28.973 に答える
4
String[] students = new String[10];
// 1. One object (array of String, 1 reference to it - students)
String studentName = "Peter Smith";
// 2. Two objects (array from (1), string 'Petter Smith'), two references 
// (students from (1), studentName that refers String object )
students[0] = studentName;
// 3. Two objects (the same as (2)), 3 references ( in addition to references (2) 
// first element of students array refers to the same object as studentName
studentName = null;
// Two objects (Array and String "Peter Smith"), two references (one is array, 
// another is students[0] 
// Neither of them can be marked for garbage collection at this point 
// (Array and String "Peter Smith" )

それが理にかなっていることを願っています。

于 2013-06-02T13:20:33.480 に答える
3

studentNameの参照を null に設定しても、オブジェクトは複数の参照を持つことができますstudent[0]。そのため、文字列"Peter Smith"をガベージ コレクションすることはできません。

于 2013-06-02T13:18:40.060 に答える
3

ここ"Peter Smithにオブジェクトが割り当てられてstudents[0]いるため、ガベージコレクションを実行できずstudentName=null、何も指していないため、ガベージコレクションを試行しません。

したがって、両方ともガベージ コレクションはできません。

于 2013-06-02T13:14:24.530 に答える
1

それstudentsはオブジェクトですが、それは String 配列型のオブジェクトです。配列では、配列の各要素が他のオブジェクトを参照できます。最初の要素「students[0]」は「Peter Smith」を含む文字列オブジェクトを参照しているため、オブジェクトは引き続き参照されているため、ガベージ コレクションの対象にはなりません。学生が範囲外になり、GC 自体の資格を得ると、文字列オブジェクトも同様になります。

于 2013-06-02T13:16:47.110 に答える
1

studentsインスタンス化されてから変更されるため、まだ参照があるため、収集する理由はありません。studentNameがインスタンス化されると、参照が に割り当てられるstudentsため、最後の行で逆参照されると、オブジェクトへの参照 (文字列) がまだ配列に存在するため、GC によって何も収集されません。

于 2013-06-02T13:17:29.613 に答える