1. 程式人生 > >java基礎(四) Java的四種引用,強弱軟虛,用到的場景

java基礎(四) Java的四種引用,強弱軟虛,用到的場景

強引用:

強引用不會被GC回收,並且在java.lang.ref裡也沒有實際的對應型別,平時工作接觸的最多的就是強引用。

Object obj = new Object();這裡的obj引用便是一個強引用。

如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它

當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足問題。

軟引用:

如果一個物件只具有軟引用,那就類似於可有可物的生活用品。

如果記憶體空間足夠,垃圾回收器就不會回收它,如果記憶體空間不足了,就會回收這些物件的記憶體

只要垃圾回收器沒有回收它,該物件就可以被程式使用。軟引用可用來實現記憶體敏感的快取記憶體。

軟引用可以和一個引用佇列(ReferenceQueue)聯合使用,如果軟引用所引用的物件被垃圾回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用佇列中。

弱引用:

弱引用(weak reference)在強度上弱於軟引用,通過類WeakReference來表示。

它的作用是引用一個物件,但是並不阻止該物件被回收。如果使用一個強引用的話,只要該引用存在,那麼被引用的物件是不能被回收的。

弱引用則沒有這個問題。在垃圾回收器執行的時候,如果一個物件的所有引用都是弱引用的話,該物件會被回收。

弱引用的作用在於解決強引用所帶來的物件之間在存活時間上的耦合關係。

弱引用最常見的用處是在集合類中,尤其在雜湊表中。雜湊表的介面允許使用任何Java物件作為鍵來使用。

當一個鍵值對被放入到雜湊表中之後,雜湊表物件本身就有了對這些鍵和值物件的引用。

如果這種引用是強引用的話,那麼只要雜湊表物件本身還存活,其中所包含的鍵和值物件是不會被回收的。

如果某個存活時間很長的雜湊表中包含的鍵值對很多,最終就有可能消耗掉JVM中全部的記憶體。

對於這種情況的解決辦法就是使用弱引用來引用這些物件,這樣雜湊表中的鍵和值物件都能被垃圾回收。

Java中提供了WeakHashMap來滿足這一常見需求。

虛引用:

在介紹幽靈引用之前,要先介紹Java提供的物件終止化機制finalization)。在Object類裡面有個finalize方法,其設計的初衷是在一個物件被真正回收之前,可以用來執行一些清理的工作。

因為Java並沒有提供類似C++的解構函式一樣的機制,就通過 finalize方法來實現。但是問題在於垃圾回收器的執行時間是不固定的,所以這些清理工作的實際執行時間也是不能預知的。

幽靈引用(phantom reference)可以解決這個問題。在建立幽靈引用PhantomReference的時候必須要指定一個引用佇列。

當一個物件的finalize方法已經被呼叫了之後,這個物件的幽靈引用會被加入到佇列中。

通過檢查該佇列裡面的內容就知道一個物件是不是已經準備要被回收了。

幽靈引用及其佇列的使用情況並不多見,主要用來實現比較精細的記憶體使用控制,這對於移動裝置來說是很有意義的。

程式可以在確定一個物件要被回收之後,再申請記憶體建立新的物件。通過這種方式可以使得程式所消耗的記憶體維持在一個相對較低的數量