package cn.zwy.test;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
import org.junit.Test;
public class TestReference {
//public static Map<String, SoftReference<String>> map = new HashMap<String,SoftReference<String>>();
@Test
public void testWeadReference() {
/*weakReference引用,当所引用的对象没有强引用的时候,对象就会被jvm回收.*/
String data = new String("hello");
WeakReference reference = new WeakReference(data);
System.out.println("=============回收之前");
System.out.println(reference.get());
System.out.println(data == reference.get());
System.out.println("=============回收之后");
data= null;
System.gc();
System.out.println(reference.get());
System.out.println("=============回收之后");
}
@Test
public void testWeadHashMap() throws InterruptedException {
String key = new String("hello");
String value = new String("value");
WeakHashMap<String, String> map = new WeakHashMap<String, String>();
System.out.println("=============回收之前");
map.put(key, value);
System.out.println(map.containsValue(value));
key = null;
System.out.println("=============回收之后");
System.gc();
/**
* 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理
*/
Thread.sleep(1000);
/**
* 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry
*/
System.out.println(map.containsValue(value));
System.out.println("=============回收之后");
}
@Test
public void testSoftReference() {
/*跟weakReference一样,最大的差别是softReference会尽量的保留知道jvm内存不足时候
* 才会被释放,所以适合于缓存的应用*/
String data = new String("hello");
SoftReference reference = new SoftReference(data);
System.out.println("=============回收之前");
System.out.println(reference.get());
System.out.println(data == reference.get());
System.out.println("=============回收之后");
data= null;
System.gc();
System.out.println(reference.get());
System.out.println("=============回收之后");
}
/*
public static void main(String[] args) throws InterruptedException {
String data = new String("hello");
SoftReference<String> data1 = new SoftReference<String>(data);
//put(data1);
data = null;
System.gc();
System.runFinalization();
System.out.println(data1.get() +"123");
Object referent = new Object();
WeakReference<Object> weakRerference = new WeakReference<Object>(referent);
System.out.println(weakRerference.get());
System.out.println(referent == weakRerference.get());
referent = null;
System.gc();
/**
* 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收
*/
/* System.out.println("111" + weakRerference.get());
// assertNull(weakRerference.get());
}*/
@Test
public void test(){
//创建一个对象
Person person = new Person("Sunny");
//创建一个引用队列
ReferenceQueue<Person> rq = new ReferenceQueue<Person>();
//创建一个虚引用,让此虚引用引用到person对象
PhantomReference<Person> pr = new PhantomReference<Person>(person, rq);
//切断person引用变量和对象的引用
person = null;
//试图取出虚引用所引用的对象
//发现程序并不能通过虚引用访问被引用对象,所以此处输出为null
System.out.println(pr.get());
//强制垃圾回收
System.gc();
System.runFinalization();
//因为一旦虚引用中的对象被回收后,该虚引用就会进入引用队列中
//所以用队列中最先进入队列中引用与pr进行比较,输出true
System.out.println(rq.poll() == pr);
}
}