[Java]四种引用类型

强引用

通常程序中经过new建立的对象的引用都是强引用,强引用只有在从根节点不可达的状况下才会被垃圾回收器回收,因此可能产生内存溢出。
java

软引用

使用SoftReference建立,弱于强引用,在内存紧张的时候会被回收,不会产生内存溢出。 ide

弱引用

使用WeakReference建立,弱于软引用,在系统gc时只要发现弱引用直接回收,不会产生内存溢出。 this

虚引用

使用PhantomReference建立,最弱的引用类型,随时均可以被垃圾回收器回收,配合引用队列使用能够跟踪对象的回收,所以能够将一些资源的释放放在虚引用中执行和记录。 spa

代码示例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
package com.winwill.reference;  import org.junit.Test;  import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference;  /**  * @author qifuguang  * @date 15-5-27 下午4:45  */ public class TestReference {  public static class User {  private String name;  private int id;   public User(String name, int id) {  this.name = name;  this.id = id;  }   @Override  public String toString() {  return id + ":" + name;  }  }   @Test  public void testReference() throws Exception {  /** 建立强引用对象*/  User u = new User("winwill", 1);   /**使用强引用对象建立软引用对象*/  SoftReference<User> userSoftReference = new SoftReference<User>(u);  /**使用强引用对象建立弱引用对象*/  WeakReference<User> userWeakReference = new WeakReference<User>(u);   /**使用强引用对象建立虚引用对象*/  ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();  PhantomReference<User> userPhantomReference = new PhantomReference<User>(u, referenceQueue);  /**删除强引用*/  u = null;   /**经过软引用获取*/  System.out.println(userSoftReference.get());  /**经过虚引用获取*/  System.out.println(userWeakReference.get());  /**经过虚引用获取*/  System.out.println(userPhantomReference.get());  } }

代码输出结果以下:
这里写图片描述 .net

能够看到,没法使用虚引用获取它引用的对象,再者,虚引用配合引用队列能够跟踪对象的回收时间,所以,能够将一些资源的释放操做放置在虚引用中执行和记录. code

相关文章
相关标签/搜索