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);
}
}