WeakReference(弱引用)とソフトReference(弱引用)

2306 ワード

Javaプログラムを書きたいなら、あるオブジェクトがいつごみ収集の実行によって削除されるかを観察してください。このオブジェクトをいつでも観察するために、referenceを使って覚えなければなりません。
java.lang.ref.Weak Reference
でも、今はWeak Referenceがあったら、これで解決できます。いつでも相手の情報を得たいと思っていますが、相手のゴミ収集に影響を与えたくないなら、相手をWeak Referenceで覚えるべきです。
Soft ReferenceはWeak Referenceと似ていますが、用途は違います。Soft Referenceに指摘されたオブジェクトは、たとえ何のDirect Referenceがなくてもクリアされません。JVMメモリが足りない時までDirect Referenceがない時に掃除します。ソフトReferenceはobject-cacheを設計するのに使います。これによりソフトReferenceは対象cacheだけでなくメモリ不足のエラーも発生しません。ソフトレferenceも実際にpoolingを作る技術に適していると思います。

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.HashMap;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		HashMap ref = new HashMap();
		ref.put("StrongRef", new Finalize("obj"));
		ref.put("SoftRef", new SoftReference(new Finalize("soft")));
		ref.put("WeakRef", new WeakReference(new Finalize("weak")));

		try {
			HashMap map = new HashMap();
			for (int i = 0; i < Integer.MAX_VALUE; i++) {
				map.put("KEY" + i, "VALUE" + i);
			}
		} catch (OutOfMemoryError oom) {
			System.out.println(" obj oom--->" + ref.get("StrongRef"));
			System.out.println("soft oom--->"
					+ ((SoftReference) ref.get("SoftRef")).get());
			System.out.println("weak oom--->"
					+ ((WeakReference) ref.get("WeakRef")).get());
		}
	}

	static class Finalize {

		private String name;

		public Finalize(String name) {
			super();
			this.name = name;
		}

		protected void finalize() throws Throwable {
			Runtime runtime = Runtime.getRuntime();
			System.out.println(this.name + " finalize"+".free:"+runtime.freeMemory()/1024+" total:"+runtime.totalMemory()/1024);
		}

		public String toString() {
			return this.name;
		}
	}

}
出力:
weak finalize.free:5332 total:7872
ソフトfinalize.free:328 total:7872
obj oom-->obj
soft oom-->null
weak oom-->null