变量的四种引用

强引用
  只要引用存在,垃圾回收器永远不会回收,在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一
Object obj = new Object(); 
User user=new User();
  可直接通过obj取得对应的对象 如 obj.equels(new Object()); 而这样 obj 对象对后面 new Object 的一个强引用,只有当 obj 这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。
 
软引用
  非必须引用,内存溢出之前进行回收,可以通过以下代码实现。软引用需要用 SoftReference 类来实现,对于只有软引用的对象来说,当系统内存足够时它不会被回收,当系统内存空间不足时它会被回收。软引用通常用在对内存敏感的程序中。
Object obj = new Object(); 
SoftReference<Object> sf = new SoftReference<Object>(obj); 
obj = null; 
sf.get();//有时候会返回null
  这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null; 软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。
 
弱引用
  弱引用需要用 WeakReference 类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,总会回收该对象占用的内存。可以通过如下代码实现:

Object obj = new Object(); 
WeakReference<Object> wf = new WeakReference<Object>(obj); 
obj = null; 
wf.get();//有时候会返回null wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收的垃圾
  弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued 方法返回对象是否被垃圾回收器标记。
ThreadLocal 中有使用到弱引用:
public class ThreadLocal<T> { 
    static class ThreadLocalMap { 
        static class Entry extends WeakReference<ThreadLocal<?>> {
           /** The value associated with this ThreadLocal. */ 
            Object value; 
            Entry(ThreadLocal<?> k, Object v) {
                 super(k); value = v; 
            } 
        } 
    //.... 
    }
//..... 
}                
虚引用
  
  虚引用需要 PhantomReference 类来实现,它不能单独使用,必须和引用队列联合使用。虚引用的主要作用是跟踪对象被垃圾回收的状态。垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现:
Object obj = new Object(); 
PhantomReference<Object> pf = new PhantomReference<Object>(obj); 
obj=null; 
pf.get();//永远返回null 
pf.isEnQueued();//返回是否从内存中已经删除

  虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。虚引用主要用于检测对象是否已经从内存中删除。

 
 
原文地址:https://www.cnblogs.com/firecode7/p/13268196.html