1

次のコードがあります。

 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() とコメント list=null を指定して上記のコードを実行すると、上記のテスト ケースよりも空きメモリが少ないことがわかります (この場合は 160944)。どちらのシナリオでも、オブジェクトはメモリから削除されますが、これらの値が異なるのはなぜですか。

4

2 に答える 2

1

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

gc()を明示的に呼び出すと、すでに無効化されている参照やスコープ外の参照はガベージ コレクションのみの対象になります。

于 2012-04-06T07:01:27.493 に答える
0

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

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

list = null変数によって参照されていたオブジェクトを呼び出すことlistで、再度参照することはできないため、ガベージ コレクションの対象になります。

于 2012-04-06T07:20:23.930 に答える