1:对于只有软引用的对象,当内存空间充足时,不会被系统回收。只有当内存空间不足时,才有可能被回收。通常用于内存敏感的程序中。
public class SoftRefTest {
public static void main(String[] args){
String str = new String("软引用");
SoftReference sr = new SoftReference(str);
str = null;
System.out.println(sr.get());
//建议系统进行垃圾回收,但是不一定立即执行finalize方法
System.gc();
//强制执行可恢复对象的finalize方法
System.runFinalization();
//仍然输出str,因为内存空间充足不会回收
System.out.println(sr.get());
}
}
2:弱引用比软引用级别更低,当系统进行垃圾回收时,不管内存是否充足,总是会回收弱引用对象(类似于失去引用的对象)。
public class WeakRefTest{
public static void main(String[] args) throws Exception{
// 创建一个字符串对象
String str = new String("弱引用");
// 创建一个弱引用,让此弱引用引用字符串
WeakReference wr = new WeakReference(str);
// 切断str引用和字符串之间的引用
str = null;
// 弱引用只有在内存不足的情况下才会自动被回收,但可以被强制回收
System.out.println(wr.get());
// 强制垃圾回收
System.gc();
System.runFinalization();
// 输出null,因为被强制回收了
System.out.println(wr.get());
}
}
3:虚引用完全类似与没有引用,主要用于跟踪对象被垃圾回收的状态,虚引用必须和引用队列联合使用。
public class PhantomRefTest{
private PhantomRefTest temp = null;
public static void main(String[] args) throws Exception{
// 创建一个对象
PhantomRefTest prt = new PhantomRefTest();
// 创建一个引用队列
ReferenceQueue rq = new ReferenceQueue();
// 创建一个虚引用
PhantomReference pr = new PhantomReference (prt , rq);
// 切断prt和之前对象的引用
prt = null;
// 取出虚引用所引用的对象,并不能通过虚引用获取被引用的对象,所以此处输出null
System.out.println(pr.get());
// 强制垃圾回收
System.gc();
System.runFinalization();
// 垃圾回收之后,虚引用将被放入引用队列中
// 取出引用队列中最先进入队列中的引用与pr进行比较,输出true说明跟踪对象被回收
System.out.println(rq.poll() == pr);
}
/*
* 如果重写对象的finalize方法,使其在回收过程中从可恢复状态变回可达状态,那么之后就不会被回收,
* 其虚引用也就不会进入引用队列中,上述最后一行代码则输出false
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
temp = this;
}*/
}