java中的引用

Java 中除了強引用之外,還提供了其它低級別的引用


對象可達(dá)狀態(tài):

在強引用之外,弱引用可以泛化成多種不同強度的弱指針。 ? ??

以引用強度為順序的回收可以為每種強度級別關(guān)聯(lián)一個正整數(shù)。對于給定的整數(shù) a>0,

如果從根出發(fā)存在一條指針鏈可以到達(dá)某一對象,且該指針鏈重點的所有指針強度均不小于a,則稱該對象為a可達(dá)

強可達(dá):必然有一條是強引用

軟可達(dá):通過軟引用實現(xiàn),不保證gc回收時置空,jvm保證 OutOfMemery之前回收

弱可達(dá):通過弱引用實現(xiàn),gc下次時置空弱引用,回收

虛可達(dá):無法通過get()方法獲取到引用的對象,gc不負(fù)責(zé)引用置空,需手動實現(xiàn)

????????? 特殊:如果對象中實現(xiàn)了finalize()方法,jvm會為該對象創(chuàng)建FinalReference引用,一般用于保底操作(回收資源等),建議手動提前回收資源。

?當(dāng)gc掃描時,發(fā)現(xiàn)相應(yīng)的引用時,把引用放入鏈表中

jvm把引用放到discovered或者pending


判斷對象無強引用時,如果判斷該對象需要回收,把相應(yīng)引用置空,對象成不可達(dá)狀態(tài),

把discoved中引用放入pending鏈表中

③ Reference中線程Reference Handler處理pending鏈表,

  3.1 如果是Cleaner(PhantomReference子類),直接調(diào)用clean()方法

  3.2 把引用放入到自己的ReferenceQueue中。


4? 不同級別的引用對自己的隊列做不同處理

?  4.1? Finalizer(FinalReference) 調(diào)用Finalizer()方法,并且調(diào)用super.clear()置空引用


4.2 SoftReference 手動實現(xiàn)置空

4.3 weakReference 手動實現(xiàn)置空

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容