私がJava認定1Z0-803のために勉強していると私は、ガベージコレクションについての疑問をHAVA:インスタンス変数が別の変数への参照であっても、オブジェクトはGCに適格ですか?
import java.util.*;
class X {
List<String> list = new ArrayList<>();
}
public class TestGC {
// Is an Object eligible for GC even if its instance variable is references to another variable
public static void main(String[] args){
X x = new X(); // 1
List<String> list = x.list;
x = null; // 2, Is X object reference eligible for garbage collection here?
list.add("a");
list.add("b");
list.add("c");
for(String item : list) {
System.out.println(item);
}
list = null;// 3, Or X object reference eligible for garbage collection here, after list is set to null
}
}
x
はこのクラスX
位置1.
で作成されたオブジェクトX
は、インスタンス変数を持って参照していますタイプはList
です。
Iローカル変数list
タイプX
のXにlist
変数のインスタンスを参照し、その後、nullにx
を設定した場合、x
ために参照されたオブジェクトがこの線(位置2)またはI参照だからGCの対象となりますこのオブジェクトのインスタンス変数です。このオブジェクトは、そのインスタンス変数が何も参照していないとき(位置3)にのみ、GCの対象となりますか?
ただ、サイドノート:ポイント3で、 'ArrayList'は、あなたのように、null'なので'に 'list'を設定しない場合でも、ガベージコレクションの対象であります変数のスコープはそこで終了します。しかし、たとえ変数のスコープが大きかったとしても、後で読むことがないという事実により、オブジェクトは到達不能になります。この微妙な側面に興味があるなら、["非常に到達可能なオブジェクトで呼び出されたfinalize()"](http://stackoverflow.com/q/26642153/2711488)を読んでください。あなたのコードは実際に何もしないので、実行環境を最適化すれば、オブジェクトを先に収集することも、最初にオブジェクトを作成することもできません。 – Holger