日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 中引用类型

發布時間:2025/3/19 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 中引用类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java 中對象的引用分為四種級別,這四種級別由高到低依次為:強引用、軟引用、弱引用和虛引用。

強引用(StrongReference)

這個就不多說,我們寫代碼天天在用的就是強引用。如果一個對象被被人擁有強引用,那么垃圾回收器絕不會回收它。當內存空間不足,Java 虛擬機寧愿拋出 OutOfMemoryError 錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足問題。Java 的對象是位于 heap 中的,heap 中對象有強可及對象、軟可及對象、弱可及對象、虛可及對象和不可到達對象。應用的強弱順序是強、軟、弱、和虛。對于對象是屬于哪種可及的對象,由他的最強的引用決定。如下代碼:

String abc=new String("abc"); //1 SoftReference<String> softRef=new SoftReference<String>(abc); //2 WeakReference<String> weakRef = new WeakReference<String>(abc); //3 abc=null; //4 softRef.clear();//5

第一行在 heap 堆中創建內容為“abc”的對象,并建立 abc 到該對象的強引用,該對象是強可及的。
第二行和第三行分別建立對 heap 中對象的軟引用和弱引用,此時 heap 中的 abc 對象已經有 3 個引用,顯然此時 abc 對象仍是強可及的。
第四行之后 heap 中對象不再是強可及的,變成軟可及的。
第五行執行之后變成弱可及的。

軟引用(SoftReference)

如果一個對象只具有軟引用,那么如果內存空間足夠,垃圾回收器就不會回收它,如果內存空間不足了,就會回收這些對象的內存。只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。

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

軟引用是主要用于內存敏感的高速緩存。在 jvm 報告內存不足之前會清除所有的軟引用,這樣以來 gc 就有可能收集軟可及的對象,可能解決內存吃緊問題,避免內存溢出。什么時候會被收集取決于 gc 的算法和 gc 運行時可用內存的大小。當 gc 決定要收集軟引用時執行以下過程,以上面的 softRef 為例:
1 首先將 softRef 的 referent(abc)設置為 null,不再引用 heap 中的 new String(“abc”)對象。
2 將 heap 中的 new String(“abc”)對象設置為可結束的(finalizable)。
3 當 heap 中的 new String(“abc”)對象的 finalize()方法被運行而且該對象占用的內存被釋放, softRef被添加到它的 ReferenceQueue(如果有的話)中。
注意:對 ReferenceQueue 軟引用和弱引用可以有可無,但是虛引用必須有。

弱引用(WeakReference)

如果一個對象只具有弱引用,那該類就是可有可無的對象,因為只要該對象被 gc 掃描到了隨時都會把它干掉。弱引用與軟引用的區別在于:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內存區域的過程中,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是一個優先級很低的線程, 因此不一定會很快發現那些只具有弱引用的對象。

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

虛引用(PhantomReference)

"虛引用"顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。虛引用主要用來跟蹤對象被垃圾回收的活動。

虛引用與軟引用和弱引用的一個區別在于:虛引用必須和引用隊列(ReferenceQueue)聯合使用。當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。程序如果發現某個虛引用已經被加入到引用隊列,那么就可以在所引用的對象的內存被回收之前采取必要的行動。

建立虛引用之后通過 get 方法返回結果始終為 null,通過源代碼你會發現,虛引用通向會把引用的對象寫進referent,只是 get 方法返回結果為 null。先看一下和 gc 交互的過程再說一下他的作用。

1 不把 referent 設置為 null, 直接把 heap 中的 new String(“abc”)對象設置為可結束的(finalizable)。
2 與軟引用和弱引用不同, 先把 PhantomRefrence 對象添加到它的 ReferenceQueue 中.然后在釋放虛可及的對象。

總結

以上是生活随笔為你收集整理的Java 中引用类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。