相关博文连接:点击打开链接
package com.test.reference;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import com.test.enty.Emp;
public class JavaForTypeReferencesDemo {
public static void main(String[] args) throws Exception {
/**
* 只要引用存在,垃圾回收器永远不会回收
Object obj = new Object();
可直接通过obj取得对应的对象 如obj.equels(new Object());
而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。
*/
Emp emp = new Emp("M", "001", "狗娃");
List<Emp> arr = new ArrayList<Emp>();
arr.add(emp);
emp = null;
Thread.currentThread().sleep(1000);
System.out.println(arr.get(0));
/**
* 非必须引用,内存溢出之前进行回收,可以通过以下代码实现
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null
这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;
软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
*/
Emp emp1 = new Emp("M", "002", "狗剩");
SoftReference<Emp> softReference = new SoftReference<Emp>(emp1);
emp1 = null;
Thread.currentThread().sleep(1000);
System.out.println(softReference.get()+"---"+softReference.isEnqueued());
/**
* 第二次垃圾回收时回收,可以通过如下代码实现
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。
*/
Emp emp2 = new Emp("M", "003", "狗不理");
WeakReference<Emp> weakReference = new WeakReference<Emp>(emp2);
emp2 = null;
Thread.currentThread().sleep(1000);
System.out.println(weakReference.get()+"---"+weakReference.isEnqueued());
/**
* 垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除
虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
虚引用主要用于检测对象是否已经从内存中删除。
*/
Emp emp3 = new Emp("M", "004", "老铁");
ReferenceQueue<Emp> queue = new ReferenceQueue<Emp>();
PhantomReference<Emp> phantomReference = new PhantomReference<Emp>(emp3, queue);
// 这里不管emp3是否=null,虚引用都是返回的get()都是返回null;
emp3 = null;
Thread.currentThread().sleep(1000);
System.out.println(phantomReference.get()+"---"+phantomReference.isEnqueued());
System.out.println(emp3);
}
}
运行结果:
Emp [sex=M, id=001, name=狗娃]
Emp [sex=M, id=002, name=狗剩]---false
Emp [sex=M, id=003, name=狗不理]---false
null---false
null