入門比較參考這裏:http://mindprod.com/jgloss/phantom.html
可以參考這裏,已經很全面了,有時間應該翻譯一下吧
http://www.kdgregory.com/index.php?page=java.refobj
這裏的討論很不錯
http://www.javalobby.org/forums/thread.jspa?threadID=16520
jvm 的垃圾回原理可以參考這裏:
http://mindprod.com/jgloss/garbagecollection.html
http://www-01.ibm.com/support/docview.wss?uid=csc1665d3ff3ebd54e0fc825719a0027c278
最後,網上有些程序,改了改,原文是
http://www.k99k.com/texts/java-reference.html
可以考慮一下下面這個,稍微改了點,運行不會停
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.IdentityHashMap;
import java.util.Map;
class Grocery {
private static final int SIZE = 10000;
// 屬性d使得每個Grocery對象佔用較多內存,有80K左右
private double[] d = new double[SIZE];
private String id;
public Grocery(String id) {
this.id = id;
}
public String toString() {
return id;
}
public void finalize() {
System.out.println("Finalizing " + id);
}
public double[] getD() {
return d;
}
public void setD(double[] d) {
this.d = d;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public class References {
private static final int size = 10;
private static int sc = size;
private static int wc = size;
private static int pc = size;
private static ReferenceQueue<Grocery> rq = new ReferenceQueue<Grocery>();
public static void checkQueue(Map<Reference<?>, Reference<?>> refs ) {
Reference<? extends Grocery> inq = rq.poll(); // 從隊列中取出一個引用
if (inq != null && !refs.isEmpty()) {
System.out.println("------------------ In queue: " + inq + " : " + inq.get());
refs.remove(inq);
if(SoftReference.class.isAssignableFrom(inq.getClass()) ) {
sc--;
} else if(WeakReference.class.isAssignableFrom(inq.getClass()) ) {
wc--;
} else if(PhantomReference.class.isAssignableFrom(inq.getClass()) ) {
pc--;
}
System.out.printf("/t sc remains %2d, wc remains %2d, pc remains %2d/n", sc, wc, pc);
}
}
public static void main(String[] args) {
Map<Reference<?>, Reference<?>> refs = new
IdentityHashMap<Reference<?>, Reference<?>>();
// 創建10個Grocery對象以及10個軟引用
for (int i = 0; i < size; i++) {
SoftReference<Grocery> ref = new SoftReference<Grocery>(
new Grocery("Soft " + i), rq);
refs.put(ref,null);
System.out.println("Just created: " + ref);
}
System.gc();
checkQueue(refs);
// 創建10個Grocery對象以及10個弱引用
for (int i = 0; i < size; i++) {
WeakReference<Grocery> ref = new WeakReference<Grocery>(
new Grocery("Weak " + i), rq);
System.out.println("Just created: " + ref);
refs.put(ref,null);
}
System.gc();
checkQueue(refs);
// 創建10個Grocery對象以及10個虛引用
for (int i = 0; i < size; i++) {
PhantomReference<Grocery> ref = new PhantomReference<Grocery>(
new Grocery("Phantom " + i), rq);
System.out.println("Just created: " + ref);
refs.put(ref,null);
}
System.gc();
checkQueue(refs);
for(;true;) {
System.gc();
checkQueue(refs);
}
}
}