次のコードがあります。
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)。どちらのシナリオでも、オブジェクトはメモリから削除されますが、これらの値が異なるのはなぜですか。