2016-09-13 12 views
4

私が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の対象となりますか?

+0

ただ、サイドノート:ポイント3で、 'ArrayList'は、あなたのように、null'なので'に 'list'を設定しない場合でも、ガベージコレクションの対象であります変数のスコープはそこで終了します。しかし、たとえ変数のスコープが大きかったとしても、後で読むことがないという事実により、オブジェクトは到達不能になります。この微妙な側面に興味があるなら、["非常に到達可能なオブジェクトで呼び出されたfinalize()"](http://stackoverflow.com/q/26642153/2711488)を読んでください。あなたのコードは実際に何もしないので、実行環境を最適化すれば、オブジェクトを先に収集することも、最初にオブジェクトを作成することもできません。 – Holger

答えて

4

最初に、あなたは

stack --> x --> list 

xはスタックから到達可能である必要があります。

次にあなたが

stack --> x --> list 
    \  /
     \--------/ 

Xを持っているが、まだスタックから到達可能である、とリストは、xを通じて、あまりにも、到達可能で、かつスタック

上のローカル変数を介して、あなたはnullにXを設定しますあなたは持っています

stack  x --> list 
    \  /
     \--------/ 

これで、スタックからもうxに到達する方法があることがわかります。 xからリストへのパスがあるという事実は無関係です。だから、VMは、xを収集するために許可されている:

stack   list 
    \  /
     \--------/ 
+0

偉大な答え。あなたがそれらの素敵なアスキーアート芸術を創造するのにかかったよりも、これを考えるのにもっと時間がかかりました。あなたが尋ねる気にならないなら、あなたは手動でそれらを "描いた"か? – GhostCat

+0

@GhostCatはい。手作りの職人技:-) –

+0

ありがとうございました。あなたの説明は非常に明確です。 –

1

ポジション2、この時点でXオブジェクトに到達できなくなったためです。

2

2になります。xの変数を参照していないため、リストを参照しています。 xがListへの参照を持つという事実は、ガベージコレクションの適格性に影響を与えません。リストはxの内側にはなく、リストへの参照のみが存在します。

List自体はメインではまだ参照されていますが、Listとxは独立したオブジェクトであるため、ガベージコレクションの対象にはなりません。

関連する問題