私は次のコードがあります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)が表示されます。どちらのシナリオでも、オブジェクトはメモリから削除されますが、なぜこれらの値が異なるかです。
'new String(" hello ")'は2つのオブジェクトを作成します。このコンストラクタは決して使用しないでください。試してください 'list.add(" hello ")' –
@ajozwik私は '決して'とは言いません。有効なユースケースがあります。それが存在する理由です。 – EJP