[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

相關文章
相關標籤/搜索