1. 程式人生 > >強軟弱虛引用,只有體會過了,才能記住

強軟弱虛引用,只有體會過了,才能記住

以前學習強軟弱虛引用的時候,只是走馬觀花看看部落格,並沒有自己寫程式碼去實踐、去證明,導致每次看完後,過不了多久就忘了,後來下定決心,一定要自己敲敲程式碼,這樣才能讓印象更加深刻,古人云:紙上得來終覺淺,絕知此事要躬行。 ### 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