日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java中的softreference_Java中的SoftReference和WeakReference有什么区别?

發(fā)布時(shí)間:2023/12/19 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的softreference_Java中的SoftReference和WeakReference有什么区别? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題

Java中的SoftReference和WeakReference有什么區(qū)別?它們有什么不同?

#1 熱門(mén)回答(806 贊)

弱引用弱引用,簡(jiǎn)單地說(shuō),是一個(gè)不足以強(qiáng)制對(duì)象保留在內(nèi)存中的引用。弱引用允許你利用垃圾收集器為你確定可達(dá)性的能力,因此你不必自己執(zhí)行此操作。你創(chuàng)建一個(gè)像這樣的弱引用:WeakReference weakWidget = new WeakReference(widget);

然后在代碼的其他地方你可以使用weakWidget.get()來(lái)獲取實(shí)際的Widget對(duì)象。當(dāng)然,弱引用不足以阻止垃圾收集,因此你可能會(huì)發(fā)現(xiàn)(如果沒(méi)有對(duì)小部件的強(qiáng)引用)weakWidget.get()突然開(kāi)始返回null。 ...軟引用軟引用與弱引用完全相同,只是它不太愿意丟棄它引用的對(duì)象。一個(gè)只能弱到達(dá)的對(duì)象(對(duì)它的最強(qiáng)引用是WeakReferences)將在下一個(gè)垃圾收集周期被丟棄,但是一個(gè)可以輕松到達(dá)的對(duì)象通常會(huì)暫停一段時(shí)間。 SoftReferences的行為不需要與WeakReferences有任何不同,但實(shí)際上,只要內(nèi)存供應(yīng)充足,就可以保留軟可訪問(wèn)對(duì)象。這使得它們成為緩存的良好基礎(chǔ),例如上面描述的圖像緩存,因?yàn)槟憧梢宰尷占鲹?dān)心對(duì)象的可達(dá)性(永遠(yuǎn)不會(huì)從緩存中移除強(qiáng)可達(dá)對(duì)象)以及它有多糟糕需要他們消耗的記憶。

Sun JRE確實(shí)以不同于WeakReferences的方式處理SoftReferences。如果可用內(nèi)存沒(méi)有壓力,我們會(huì)嘗試保持SoftReference引用的對(duì)象。一個(gè)細(xì)節(jié):“-client”和“-server”JRE的策略是不同的:-client JRE試圖通過(guò)清除SoftReferences而不是擴(kuò)展堆來(lái)保持你的足跡小,而-server JRE嘗試保留你的通過(guò)優(yōu)先擴(kuò)展堆(如果可能)而不是清除SoftReferences來(lái)提高性能。一種尺寸并不適合所有人。

#2 熱門(mén)回答(183 贊)

急切地收集弱引用。如果GC發(fā)現(xiàn)某個(gè)對(duì)象是弱可達(dá)的(只能通過(guò)弱引用訪問(wèn)),它將立即清除對(duì)該對(duì)象的弱引用。因此,它們有助于保持對(duì)程序也保留(強(qiáng)烈引用)“關(guān)聯(lián)信息”的對(duì)象的引用,例如關(guān)于類的緩存反射信息,或?qū)ο蟮陌b器等。任何使得在它與之關(guān)聯(lián)的對(duì)象之后保持不變是GC-ed。當(dāng)弱引用被清除時(shí),它會(huì)在代碼輪詢某個(gè)地方的引用隊(duì)列中排隊(duì),并且它也會(huì)丟棄關(guān)聯(lián)的對(duì)象。也就是說(shuō),你保留有關(guān)對(duì)象的額外信息,但一旦它引用的對(duì)象消失,就不需要該信息。實(shí)際上,在某些情況下,你甚至可以繼承WeakReference,并在WeakReference子類的字段中保留有關(guān)該對(duì)象的相關(guān)額外信息。 WeakReference的另一個(gè)典型用法是與Maps一起保存規(guī)范實(shí)例。

另一方面,SoftReferences適用于緩存外部可再生資源,因?yàn)镚C通常會(huì)延遲清除它們。雖然在拋出OutOfMemoryError之前所有SoftReferences都會(huì)被清除,但是理論上它們不會(huì)導(dǎo)致OOME [*]。

典型的用例示例是從文件中保留已解析形式的內(nèi)容。你將實(shí)現(xiàn)一個(gè)系統(tǒng),你可以在其中加載文件,解析文件,并將SoftReference保留在已解析表示的根對(duì)象中。下次需要該文件時(shí),你將嘗試通過(guò)SoftReference檢索它。如果你可以檢索它,你可以節(jié)省自己的另一個(gè)加載/解析,如果GC在此期間清除它,你重新加載它。這樣,你可以利用可用內(nèi)存進(jìn)行性能優(yōu)化,但不要冒OOME風(fēng)險(xiǎn)。

現(xiàn)在為[*]。保持SoftReference本身不會(huì)導(dǎo)致OOME。另一方面,如果你錯(cuò)誤地將SoftReference用于任務(wù),則應(yīng)使用WeakReference(即,你以某種方式強(qiáng)烈引用與Object關(guān)聯(lián)的信息,并在Reference對(duì)象被清除時(shí)丟棄它),你可以運(yùn)行到OOME中輪詢ReferenceQueue并丟棄關(guān)聯(lián)對(duì)象的代碼可能不會(huì)及時(shí)運(yùn)行。

因此,決定取決于使用情況 - 如果你正在緩存構(gòu)造成本高昂的信息,但仍然可以從其他數(shù)據(jù)重建,請(qǐng)使用軟引用 - 如果你要保留對(duì)某些數(shù)據(jù)的規(guī)范實(shí)例的引用,或者你希望引用一個(gè)沒(méi)有“擁有”它的對(duì)象(從而防止它被GC化),使用弱引用。

#3 熱門(mén)回答(97 贊)

在Java中;從最強(qiáng)到最弱的順序,有:強(qiáng),軟,弱和幻影

A強(qiáng)引用是一個(gè)普通引用,它通過(guò)GC保護(hù)引用對(duì)象不被集合。即從不垃圾收集。

A軟參考符合垃圾收集器的收集條件,但在需要內(nèi)存之前可能不會(huì)收集。即垃圾收集在'OutOfMemoryError`之前。

A弱引用是一個(gè)引用,它不保護(hù)引用的對(duì)象不被GC收集。即沒(méi)有強(qiáng)力或軟質(zhì)參考時(shí)垃圾收集。

A幻像引用是一個(gè)對(duì)象的引用,它在完成后被引用,但在其已分配的內(nèi)存被回收之前被引用。

**類比:**假設(shè)JVM是一個(gè)王國(guó),物體是王國(guó)的王者,GC是試圖殺死國(guó)王(物體)的王國(guó)的攻擊者。

當(dāng)King強(qiáng)者時(shí),GC無(wú)法殺死他。

當(dāng)King為Soft時(shí),GC會(huì)攻擊他,但King會(huì)保護(hù)王國(guó),直到有資源可用。

當(dāng)King為弱者時(shí),GC會(huì)攻擊他,但在沒(méi)有保護(hù)的情況下統(tǒng)治王國(guó)。

當(dāng)國(guó)王是幻影時(shí),GC已經(jīng)殺死了他,但國(guó)王可以通過(guò)他的靈魂獲得。

總結(jié)

以上是生活随笔為你收集整理的java中的softreference_Java中的SoftReference和WeakReference有什么区别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。