import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
public class Test {
public static void main(String [] args) throws InterruptedException {
// testPlantomReference(); //虚引用
// testWeakReference(); //弱引用
testSoftReference(); //软引用
}
static void testSoftReference() throws InterruptedException {
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
SoftReference reference = new SoftReference(obj, queue);
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get());//不为null
obj = null;
//不要使用下一行代码,因为下一行代码会导致reference对象被GC回收,导致queue的poll()返回空
// reference = null; //这句话会导致下面的queue.poll()返回空,即reference对象都被回收了!!!
System.gc();
Thread.sleep(2000);
System.out.println("-----after gc-----------");
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get());//不为null,只在内存不足时,obj对象才会被GC回收
}
static void testWeakReference() throws InterruptedException {
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
WeakReference reference = new WeakReference(obj, queue);
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get()); //不为null,其余和虚引用一样
obj = null;
//不要使用下一行代码,因为下一行代码会导致reference对象被GC回收,导致queue的poll()返回空
// reference = null; //这句话会导致下面的queue.poll()返回空,即reference对象都被回收了!!!
System.gc();
Thread.sleep(2000);
System.out.println("-----after gc-----------");
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get());
}
static void testPlantomReference() throws InterruptedException {
Object obj = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference reference = new PhantomReference(obj, queue);
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get()); //为null,其余和虚引用一样
obj = null;
//不要使用下一行代码,因为下一行代码会导致reference对象被GC回收,导致queue的poll()返回空
// reference = null; //这句话会导致下面的queue.poll()返回空,即reference对象都被回收了!!!
System.gc();
Thread.sleep(2000);
System.out.println("-----after gc-----------");
System.out.println("obj:" + obj);
System.out.println("queue:" + queue.poll());
System.out.println("reference:" + reference);
System.out.println("reference.get():" + reference.get());
}
}