java中的softreference_Java中的SoftReference和WeakReference有什么区别?
問題
Java中的SoftReference和WeakReference有什么區(qū)別?它們有什么不同?
#1 熱門回答(806 贊)
弱引用弱引用,簡單地說,是一個不足以強制對象保留在內(nèi)存中的引用。弱引用允許你利用垃圾收集器為你確定可達(dá)性的能力,因此你不必自己執(zhí)行此操作。你創(chuàng)建一個像這樣的弱引用:WeakReference weakWidget = new WeakReference(widget);
然后在代碼的其他地方你可以使用weakWidget.get()來獲取實際的Widget對象。當(dāng)然,弱引用不足以阻止垃圾收集,因此你可能會發(fā)現(xiàn)(如果沒有對小部件的強引用)weakWidget.get()突然開始返回null。 ...軟引用軟引用與弱引用完全相同,只是它不太愿意丟棄它引用的對象。一個只能弱到達(dá)的對象(對它的最強引用是WeakReferences)將在下一個垃圾收集周期被丟棄,但是一個可以輕松到達(dá)的對象通常會暫停一段時間。 SoftReferences的行為不需要與WeakReferences有任何不同,但實際上,只要內(nèi)存供應(yīng)充足,就可以保留軟可訪問對象。這使得它們成為緩存的良好基礎(chǔ),例如上面描述的圖像緩存,因為你可以讓垃圾收集器擔(dān)心對象的可達(dá)性(永遠(yuǎn)不會從緩存中移除強可達(dá)對象)以及它有多糟糕需要他們消耗的記憶。
Sun JRE確實以不同于WeakReferences的方式處理SoftReferences。如果可用內(nèi)存沒有壓力,我們會嘗試保持SoftReference引用的對象。一個細(xì)節(jié):“-client”和“-server”JRE的策略是不同的:-client JRE試圖通過清除SoftReferences而不是擴展堆來保持你的足跡小,而-server JRE嘗試保留你的通過優(yōu)先擴展堆(如果可能)而不是清除SoftReferences來提高性能。一種尺寸并不適合所有人。
#2 熱門回答(183 贊)
急切地收集弱引用。如果GC發(fā)現(xiàn)某個對象是弱可達(dá)的(只能通過弱引用訪問),它將立即清除對該對象的弱引用。因此,它們有助于保持對程序也保留(強烈引用)“關(guān)聯(lián)信息”的對象的引用,例如關(guān)于類的緩存反射信息,或?qū)ο蟮陌b器等。任何使得在它與之關(guān)聯(lián)的對象之后保持不變是GC-ed。當(dāng)弱引用被清除時,它會在代碼輪詢某個地方的引用隊列中排隊,并且它也會丟棄關(guān)聯(lián)的對象。也就是說,你保留有關(guān)對象的額外信息,但一旦它引用的對象消失,就不需要該信息。實際上,在某些情況下,你甚至可以繼承WeakReference,并在WeakReference子類的字段中保留有關(guān)該對象的相關(guān)額外信息。 WeakReference的另一個典型用法是與Maps一起保存規(guī)范實例。
另一方面,SoftReferences適用于緩存外部可再生資源,因為GC通常會延遲清除它們。雖然在拋出OutOfMemoryError之前所有SoftReferences都會被清除,但是理論上它們不會導(dǎo)致OOME [*]。
典型的用例示例是從文件中保留已解析形式的內(nèi)容。你將實現(xiàn)一個系統(tǒng),你可以在其中加載文件,解析文件,并將SoftReference保留在已解析表示的根對象中。下次需要該文件時,你將嘗試通過SoftReference檢索它。如果你可以檢索它,你可以節(jié)省自己的另一個加載/解析,如果GC在此期間清除它,你重新加載它。這樣,你可以利用可用內(nèi)存進(jìn)行性能優(yōu)化,但不要冒OOME風(fēng)險。
現(xiàn)在為[*]。保持SoftReference本身不會導(dǎo)致OOME。另一方面,如果你錯誤地將SoftReference用于任務(wù),則應(yīng)使用WeakReference(即,你以某種方式強烈引用與Object關(guān)聯(lián)的信息,并在Reference對象被清除時丟棄它),你可以運行到OOME中輪詢ReferenceQueue并丟棄關(guān)聯(lián)對象的代碼可能不會及時運行。
因此,決定取決于使用情況 - 如果你正在緩存構(gòu)造成本高昂的信息,但仍然可以從其他數(shù)據(jù)重建,請使用軟引用 - 如果你要保留對某些數(shù)據(jù)的規(guī)范實例的引用,或者你希望引用一個沒有“擁有”它的對象(從而防止它被GC化),使用弱引用。
#3 熱門回答(97 贊)
在Java中;從最強到最弱的順序,有:強,軟,弱和幻影
A強引用是一個普通引用,它通過GC保護(hù)引用對象不被集合。即從不垃圾收集。
A軟參考符合垃圾收集器的收集條件,但在需要內(nèi)存之前可能不會收集。即垃圾收集在'OutOfMemoryError`之前。
A弱引用是一個引用,它不保護(hù)引用的對象不被GC收集。即沒有強力或軟質(zhì)參考時垃圾收集。
A幻像引用是一個對象的引用,它在完成后被引用,但在其已分配的內(nèi)存被回收之前被引用。
**類比:**假設(shè)JVM是一個王國,物體是王國的王者,GC是試圖殺死國王(物體)的王國的攻擊者。
當(dāng)King強者時,GC無法殺死他。
當(dāng)King為Soft時,GC會攻擊他,但King會保護(hù)王國,直到有資源可用。
當(dāng)King為弱者時,GC會攻擊他,但在沒有保護(hù)的情況下統(tǒng)治王國。
當(dāng)國王是幻影時,GC已經(jīng)殺死了他,但國王可以通過他的靈魂獲得。
總結(jié)
以上是生活随笔為你收集整理的java中的softreference_Java中的SoftReference和WeakReference有什么区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这样安装python库才是最正确的哦_这
- 下一篇: 多线程 java 实例_Java多线程实