標籤:
1、強引用 平時我們編程的時候例如:Object object=new Object();那object就是一個強引用了。如果一個對象具有強引用,那就類似於必不可少的生活用品,記憶體回收行程絕不會回收它。當記憶體空 間不足,Java虛擬機器寧願拋出OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的對象來解決記憶體不足問題。
2、軟引用(SoftReference) 如果一個對象只具有軟引用,那就類似於可有可物的生活用品。如果記憶體空間足夠,記憶體回收行程就不會回收它,如果記憶體空間不足了,就會回收這些對象的記憶體。只 要記憶體回收行程沒有回收它,該對象就可以被程式使用。軟引用可用來實現記憶體敏感的快取。 軟引用可以和一個引用隊列(ReferenceQueue)聯 合使用,如果軟引用所引用的對象被記憶體回收,Java虛擬機器就會把這個軟引用加入到與之關聯的引用隊列中。
3、弱引用(WeakReference)
如果一個對象只具有弱引用,那就類似於可有可物的生活用品。弱引用與軟引用的區別在於:只具有弱引用的對象擁有更短暫的生命週期。在記憶體回收行程線程掃描它 所管轄的記憶體地區的過程中,一旦發現了只具有弱引用的對象,不管當前記憶體空間足夠與否,都會回收它的記憶體。不過,由於記憶體回收行程是一個優先順序很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。 弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被垃圾回 收,Java虛擬機器就會把這個弱引用加入到與之關聯的引用隊列中。
普通的對象屬於強引用:
String a =
new
String(
"強引用"
)
為什麼需要使用軟引用?
首先,我們看一個僱員資訊查詢系統的執行個體。我們將使用一個Java語言實現的僱員資訊查詢系統查詢儲存在磁碟檔案或者資料庫中的僱員人事檔案資訊。作為一 個使用者,我們完全有可能需要回頭去查看幾分鐘甚至幾秒鐘前查看過的僱員檔案資訊(同樣,我們在瀏覽WEB頁面的時候也經常會使用“後退”按鈕)。這時我們 通常會有兩種程式實現方式:一種是把過去查看過的僱員資訊儲存在記憶體中,每一個儲存了僱員檔案資訊的Java對象的生命週期貫穿整個應用程式始終;另一種 是當使用者開始查看其他僱員的檔案資訊的時候,把儲存了當前所查看的僱員檔案資訊的Java對象結束引用,使得垃圾收集線程可以回收其所佔用的記憶體空間,當 使用者再次需要瀏覽該僱員的檔案資訊的時候,重新構建該僱員的資訊。很顯然,第一種實現方法將造成大量的記憶體浪費,而第二種實現的缺陷在於即使垃圾收集線程 還沒有進行垃圾收集,包含僱員檔案資訊的對象仍然完好地儲存在記憶體中,應用程式也要重新構建一個對象。我們知道,訪問磁碟檔案、訪問網路資源、查詢資料庫 等操作都是影響應用程式執行效能的重要因素,如果能重新擷取那些尚未被回收的Java對象的引用,必將減少不必要的訪問,大大提高程式的運行速度。
為什麼要使用弱引用
假設一個對象有自己的生命週期,“沒用時”會自己回收,但是如果這裡要把它添加到一個數組,不用弱引用會導致它在記憶體空餘時改回收了也不被回收,因為他就像是強引用,
使用弱引用不會打亂他的生命週期,但是任然可以它存在數組以便需要的時候從數組擷取到它
Done!
java中對對象的參考型別