java.lang.ref 包提供了SoftReference、PhantomReference和WeakReference三种对象引用方式。
一 强引用(StrongReference)
当一个对象被一个或一个以上的引用变量引用时,处于可达状态,不可能被系统垃圾回收机制回收。
二 软引用(SoftReference)
当一个对象只有软引用时,有可能被垃圾回收机制回收。当系统内存空间足够时,不会被系统回收,程序也可使用该对象;当系统内存空间不足时,系统可能会回收。
三 弱引用(WeakReference)
对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。
四 虚引用(PhantomReference)
虚引用与没有引用大致相同,主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,必须和引用队列(ReferenceQueue)联合使用。
引用类都包含了get()
方法,用于获取引用对象。
eg:
public class ReferenceTest {
public static void main(String[] args) {
String s = new String("java");
WeakReferenece wr = new WeakReference(s);
s = null;
System.out.println(wr.get());
System.gc();
System.runFinalization();
System.out.println(wr.get());
}
}
public class PhantomReferenceTest {
public static void main(String[] args) {
String s = new String("java");
ReferenceQueue rq = new ReferenceQueue();
PhantomReference pr = new PhantomReference(s,rq);
s = null;
System.out.println(pr.get());
System.gc();
System.runFinalization();
System.out.println(rq.poll() == pr);
}
}