JAVA四种引用
java对象的引用包括:
- 强引用
- 软引用
- 弱引用
- 虚引用
Java中提供这四种引用类型主要有两个目的:
第一是可以让程序员通过代码的方式决定某些对象的生命周期;
第二是有利于JVM进行垃圾回收。
实际用例
1.强引用
是指创建一个对象并把这个对象赋给一个引用变量。
比如
Object object =new Object();
String str ="哈哈哈";
强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
2.软引用
软引用的特点是,如果JVM内存空间充沛,垃圾回收器就不会回收软引用变量。
在回收器对这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。
举个栗子:
BinarySearch bs = new BinarySearch();//二分查找
bs.find(test, 0, test.length - 1, 5);
SoftReference<BinarySearch> ruanYinYong = new SoftReference<BinarySearch>(bs);
bs = null;
ruanYinYong.get().find(test, 0, test.length - 1, 5);//即便强引用已经为Null,但是软引用还可以继续用。
如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。(弱引用也是如此)
3.弱引用
WeakReference<People>reference=new WeakReference<People>(new People("zhouqian",20));
System.out.println(reference.get());
System.gc();//通知垃圾回收器回收资源
System.out.println(reference.get());
第一个输出,第二个输出为null
4.虚引用
java中使用PhantomReference来表示虚引用。就像某个对象没有引用与之关联一样,若某个对象与虚引用关联,那么在任何时候都可能被JVM回收掉。虚引用不能单独使用,必须配合引用队列一起使用。
当垃圾回收器发现对象与虚引用关联,就会在回收它之前,将这个虚引用加入到引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被回收,从而进行操作。
ReferenceQueue<String> queue = new ReferenceQueue<>();
PhantomReference<String> str = new PhantomReference<String>("chx", queue);
System.out.println(str.get());
5.软引用结合回调函数使用
import java.lang.ref.SoftReference;
public class CallBackMain {
SoftReference<CallBackTest> ruanYinYong = new SoftReference<CallBackTest>(new CallBackTest());
public static void main(String[] args) {
new CallBackMain().startCallBack();
}
public void startCallBack() {
System.out.println("我去做别的了");
ruanYinYong.get().callBack();
}
}
class CallBackTest {
public static int b = 1;
public void callBack() {
System.out.println("我是回调函数" + b);
}
}