入门比较参考这里: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);
}
}
}