2012-04-06 33 views
1

私は次のコードがありますJavaのガベージコレクションとヌル

List<String> list = new ArrayList<String>(); 
    // WeakReference<List> wr = new WeakReference<List>(list); 
    System.out.println(" before tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" before free memory... " + Runtime.getRuntime().freeMemory()); 
    for(int i =0; i<100; i++) 
    list.add(new String("hello")); 
    //System.gc(); 
    list = null; //forcefully end its life expectancy 
    System.out.println(" after tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" after free memory... " + Runtime.getRuntime().freeMemory()); 
    System.out.println(" after memory used ... " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); 
    // System.out.println(" weak reference " + wr.get()); 

を私は上記のコードを実行すると、私は空きメモリが361064で見ることができますが(私のシステムでは、しかし、この値は変更になる場合があります)

しかし、System.gc()とcomment list = nullで上記のコードを実行すると、上記のテストケースより少ない空きメモリ(この場合は160944)が表示されます。どちらのシナリオでも、オブジェクトはメモリから削除されますが、なぜこれらの値が異なるかです。

+1

'new String(" hello ")'は2つのオブジェクトを作成します。このコンストラクタは決して使用しないでください。試してください 'list.add(" hello ")' –

+0

@ajozwik私は '決して'とは言いません。有効なユースケースがあります。それが存在する理由です。 – EJP

答えて

1

list = null;参照を無効にすると、自動的にガベージコレクションが行われます。この行をコメントすると、参照のリストはまだアクティブです。System.gc()に電話しても、ガベージコレクションは行われません。

gc()を明示的に呼び出すと、すでに無効化されているか、範囲外の参照はガベージコレクションされます。

+0

その場合、System.gc()の使用は何ですか?また、もしlist = nullがコメントされ、アプリケーションを実行すると、何かを解放したり解放したりするためSystem.gc()呼び出しが何をするのですか? – UVM

+0

@UNNI gc()は、無効になっているか、範囲外です。アクティブな参照をクリアすることはありません。 –

+0

上記のテストケースでは、System.gc()でのみ実行したときにメモリや値が解放されます。この場合、THAT値は解放されます。リストはまだアクティブなので、gcedされません。 – UVM

0

GCは、プログラム内のobjects which are no longer being referencedを見つけるために、メモリ内のすべてのオブジェクトを調べることによって動作します。これらの未使用のオブジェクトは、新しいメモリオブジェクトのための空間を作るために削除することができます。

したがって、オブジェクトがまだ参照されている場合、System.gc()を呼び出してもガベージコレクションはできません。コード内でオブジェクトを参照できる場合、どのようにオブジェクトをガベージコレクションできますか?

で参照されていたオブジェクトを再度参照することはできません。したがって、ガベージコレクションを取得することができます。list = null

関連する問題