垃圾回收(四)【弱引用】
如果應用程式的程式碼可以訪問一個正由該程式使用的物件,垃圾回收器就不能回收該物件, 那麼,就認為應用程式對該物件具有強引用。
弱引用允許應用程式訪問物件,同時也允許垃圾回收器收集相應的物件。 如果不存在強引用,則弱引用的有限期只限於收集物件前的一個不確定的時間段。 使用弱引用時,應用程式仍可對該物件進行強引用,這樣做可防止該物件被收集。 但始終存在這樣的風險:垃圾回收器在重新建立強引用之前先處理該物件。
佔用大量記憶體,但通過垃圾回收功能回收以後很容易重新建立的物件特別適合使用弱引用。
假設 Windows
窗體應用中的樹狀檢視向使用者顯示層次結構複雜的選項。 如果基礎資料量很大,則使用者使用應用程式中的其他部分時,在記憶體中保留該樹會導致效率低下。
當使用者切換到應用的其他部分時,可以使用WeakReference 類建立對樹的弱引用,並銷燬所有強引用。 當使用者切換回該樹時,應用程式會嘗試獲得對該樹的強引用,如果成功,就不必重新構造該樹。
若要對某物件建立弱引用,請使用要跟蹤的物件例項建立 WeakReference
。 然後將 Target
屬性設定為該物件,將該物件的原始引用設定為 null
。 有關程式碼示例,請參閱類庫中的 WeakReference
。
短弱引用和長弱引用
可以建立短弱引用或長弱引用:
Short
垃圾回收功能回收物件後,短弱引用的目標會變為null
。 弱引用本身是託管物件,與其他任何託管物件一樣需要經過垃圾回收。 短弱引用是WeakReference
的預設建構函式。Long
在物件的 Finalize
方法已呼叫後,長弱引用獲得保留。 這樣,便可以重新建立該物件,但該物件仍保持不可預知的狀態。 若要使用長引用,請在WeakReference
建構函式中指定true
。
如果物件型別不包含Finalize
方法,應用的是短弱引用功能。弱引用只在目標被收集前有效,執行終結器後可以隨時收集目標。
若要建立強引用並重新使用物件,請將 WeakReference
的 Target
屬性強制轉換為物件型別。 如果 Target
屬性返回 null
,表示物件已被收集;否則,可繼續使用物件,因為應用已重新獲得對它的強引用。
使用弱引用的準則
僅在必要時使用長弱引用,因為在終結後物件的狀態不可預知。
避免對小物件使用弱引用,因為指標本身可能和物件一樣大,或者比物件還大。
避免將弱引用作為記憶體管理問題的自動解決方案, 而應開發一個有效的快取策略來處理應用程式的物件。
相關文章
- Java四種引用包括強引用,軟引用,弱引用,虛引用。Java
- Java四大引用詳解:強引用、軟引用、弱引用、虛引用Java
- PHP的垃圾回收機制-引用計數PHP
- 垃圾回收演算法:引用計數法演算法
- 垃圾回收(三)【垃圾回收通知】
- Python中的物件引用、可變性和垃圾回收Python物件
- Java的四種引用和回收策略Java
- 強引用、軟引用、弱引用、虛引用
- 強引用 軟引用 弱引用 虛引用
- 強引用,軟引用,弱引用,虛引用
- 垃圾回收的引用計數器演算法詳解演算法
- JVM常見面試題(四):垃圾回收JVM面試題
- 強引用、軟引用、弱引用與虛引用
- 垃圾回收(一)【垃圾回收的基礎】
- 十、jvm垃圾回收演算法、垃圾收集器、引用你真的瞭解麼?JVM演算法
- Java中強、軟、弱、虛四種引用詳解Java
- 垃圾回收
- Java的強引用、軟引用、弱引用、虛引用Java
- 【JVM】垃圾回收的四大演算法JVM演算法
- 【JVM】如何理解強引用、軟引用、弱引用、虛引用?JVM
- JVM 垃圾回收演算法和垃圾回收器JVM演算法
- Python學習之路27-物件引用、可變性和垃圾回收Python物件
- [JVM]垃圾回收JVM
- golang垃圾回收Golang
- Python:垃圾回收Python
- JVM垃圾回收JVM
- 垃圾回收_上
- 垃圾回收_下
- javascript垃圾回收JavaScript
- 理解Java的強引用、軟引用、弱引用和虛引用Java
- Java/Android中的強引用、軟引用、弱引用、虛引用JavaAndroid
- Java中的弱引用Java
- Java虛擬機器-GC垃圾回收演算法-引用計數法Java虛擬機GC演算法
- 強引用、軟引用、弱引用、幻象引用有什麼區別?
- java的強引用、軟引用、弱引用、幻象引用,引用佇列總結Java佇列
- GC垃圾回收器GC
- 【Postgresql】VACUUM 垃圾回收SQL
- JVM垃圾回收(下)JVM