package learnrefclasses; 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.HashSet; import java.util.Set; /** * * * @author Moon Zang * */ class Grocery { private static final int SIZE = 10000; // 属性d使得每个Grocery对象占用较多内存,有80K左右 public 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 class References { private static ReferenceQueue<Grocery> rq = new ReferenceQueue<Grocery>(); public static void checkQueue() { Reference<? extends Grocery> inq = null; // 从队列中取出一个引用 while ((inq = rq.poll()) != null) { System.out.println("TTTTTTTTTTTTTTTTTTIn queue: " + inq + " : " + inq.get()); } } public static void main(String[] args) { final int size = 10; // 创建10个Grocery对象以及10个软引用 Set<SoftReference<Grocery>> sa = new HashSet<SoftReference<Grocery>>(); for (int i = 0; i < size; i++) { SoftReference<Grocery> ref = new SoftReference<Grocery>( new Grocery("Soft " + i), rq); System.out.println("Just created: " + ref.get()); sa.add(ref); } checkQueue(); System.gc(); checkQueue(); // 创建10个Grocery对象以及10个弱引用 Set<WeakReference<Grocery>> wa = new HashSet<WeakReference<Grocery>>(); for (int i = 0; i < size; i++) { WeakReference<Grocery> ref = new WeakReference<Grocery>( new Grocery("Weak " + i), rq); System.out.println("Just created: " + ref.get()); wa.add(ref); } checkQueue(); System.gc(); checkQueue(); // 创建10个Grocery对象以及10个虚引用 Set<PhantomReference<Grocery>> pa = new HashSet<PhantomReference<Grocery>>(); for (int i = 0; i < size; i++) { PhantomReference<Grocery> ref = new PhantomReference<Grocery>( new Grocery("Phantom " + i), rq); System.out.println("Just created: " + ref.get()); pa.add(ref); } checkQueue(); System.gc(); checkQueue(); try { Thread.sleep(1000); checkQueue(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }