簡體   English   中英

Java軟參考

[英]Java Soft References

假設我有三個對象,A,B和C。

A用軟引用引用B
B引用A時具有很強的參考意義。
B也以強引用指代C
C也以強引用指代B
C也用強引用指代A

讓我們假設沒有外部引用BC 如果我們設想一種情況,垃圾收集器決定是否可以,它將嘗試釋放軟引用指向的內存,那么BC會被釋放,而A會被釋放? 還是在從BCA的反向鏈接以某種方式阻止垃圾收集發生時發生某種循環依賴? 我的理解是,GC應該在拋出OutOfMemory之前收集軟引用。

這是一個占用大量內存的應用程序,它為非常大的層次結構建模,因此,只要沒有強引用,我希望GC丟棄層次結構的“分支”。 我可以在必要時重新生成分支,但這在計算上很昂貴,因此我使用軟引用實現了緩存。 我的一般策略是使軟引用指向下游(即樹的子節點),而強引用指向父節點。

我們假設存在對對象A的外部強烈引用。 (即某些“根”對象指向A

根據定義 ,對象B是軟可到達的,因為沒有到達B的強引用鏈,但是有一個鏈由到達B的強引用和軟引用組成。 因此,可以由JVM決定是否對B進行垃圾回收。

類似地,對象C並不是很強的可訪問性,而又是柔和的可訪問性,因此它也可以與B相同的方式進行垃圾回收。

由於定義了從根開始到達對象的定義,因此BC形成一個循環這一事實沒有任何區別。 Java使用完全常規的跟蹤垃圾收集(標記和清除或復制),不受基於引用計數的垃圾收集所遭受的參考周期的影響。

在此處輸入圖片說明

指向樹的硬引用不會阻止B和C的收集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM