通常程序中经过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