通常程序中經過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()); } } |
能夠看到,沒法使用虛引用獲取它引用的對象,再者,虛引用配合引用隊列能夠跟蹤對象的回收時間,所以,能夠將一些資源的釋放操做放置在虛引用中執行和記錄. code