強軟弱虛引用,只有體會過了,才能記住
阿新 • • 發佈:2020-03-09
以前學習強軟弱虛引用的時候,只是走馬觀花看看部落格,並沒有自己寫程式碼去實踐、去證明,導致每次看完後,過不了多久就忘了,後來下定決心,一定要自己敲敲程式碼,這樣才能讓印象更加深刻,古人云:紙上得來終覺淺,絕知此事要躬行。
### Java中的四種引用
Java中有四種引用型別:強引用、軟引用、弱引用、虛引用。
### Java為什麼要設計這四種引用
Java的記憶體分配和記憶體回收,都不需要程式設計師負責,都是由偉大的JVM去負責,一個物件是否可以被回收,主要看是否有引用指向此物件,說的專業點,叫可達性分析。
Java設計這四種引用的主要目的有兩個:
1. 可以讓程式設計師通過程式碼的方式來決定某個物件的生命週期;
2. 有利用垃圾回收。
### 強引用
強引用是最普遍的一種引用,我們寫的程式碼,99.9999%都是強引用:
```
Object o = new Object();
```
這種就是強引用了,是不是在程式碼中隨處可見,最親切。
只要某個物件有強引用與之關聯,這個物件永遠不會被回收,即使記憶體不足,JVM寧願丟擲OOM,也不會去回收。
那麼什麼時候才可以被回收呢?當強引用和物件之間的關聯被中斷了,就可以被回收了。
我們可以手動把關聯給中斷了,方法也特別簡單:
```
o = null;
```
我們可以手動呼叫GC,看看如果強引用和物件之間的關聯被中斷了,資源會不會被回收,為了更方便、更清楚的觀察到回收的情況,我們需要新寫一個類,然後重寫finalize方法,下面我們來進行這個實驗:
```
public class Student {
@Override
protected void finalize() throws Throwable {
System.out.println("Student 被回收了");
}
}
```
```
public static void main(String[] args) {
Student student = new Student();
student = null;
System.gc();
}
```
執行結果:
```
Student 被回收了
```
可以很清楚的看到資源被回收了。
*當然,在實際開發中,千萬不要重寫finalize方法*
在實際的開發中,看到有一些物件被手動賦值為NULL,很大可能就是為了“特意提醒”JVM這塊資源可以進行垃圾回收了。
### 軟引用
下面先來看看如何建立一個軟引用:
```
SoftR