weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...
weakreference
很長一段時間以來,WeakReference和SoftReference都已添加到Java API中,但是并不是每個Java程序員都熟悉它。 這意味著在Java中使用WeakReference和SoftReference的位置和方法之間存在差距。 參考類對于“垃圾收集 ” 如何工作尤為重要。 眾所周知,垃圾收集器從有資格進行垃圾收集的對象中回收內存,但是很少有程序員知道這種資格是根據指向該對象的引用類型決定的。 這也是Java中WeakReference和SoftReference之間的主要區(qū)別 。 如果只有弱引用指向該對象,并且它們被急切地收集,則垃圾收集器可以收集該對象;另一方面,當JVM絕對需要內存時,將收集具有SoftReference的對象。 SoftReference和WeakReference的這些特殊行為使它們在某些情況下很有用,例如SoftReference在實現緩存方面看起來很完美,因此當JVM需要內存時,它會刪除只有SoftReference指向它們的對象。 另一方面,WeakReference非常適合存儲元數據,例如,存儲ClassLoader引用。 如果未加載任何類,則沒有必要保留ClassLoader的引用,WeakReference會在刪除最后一個強引用后立即使ClassLoader有資格進行垃圾回收。 在本文中,我們將探索有關Java中各種參考的更多信息,例如,強引用和幻影引用。
對于那些不知道的人,Java有四種參考:
強引用是最簡單的,因為我們在日常編程中使用它,例如在代碼中,String s =“ abc”,引用變量s具有對String對象“ abc”的強引用。 任何附加了“強引用”的對象都不符合垃圾回收的條件 。 顯然,這些是Java程序所需的對象。 弱引用使用java.lang.ref.WeakReference類表示,您可以使用以下代碼創(chuàng)建弱引用:
Counter counter = new Counter(); // strong reference - line 1 WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference counter = null; // now Counter object is eligible for garbage collection現在,只要您使強引用計數器= null,在第1行創(chuàng)建的計數器對象就可以進行垃圾回收; 因為它沒有更多的“強引用”和“弱引用”(由引用變量“ weakCounter”引用)無法阻止對Counter對象進行垃圾回收。 另一方面,如果這是“軟引用”,則在JVM絕對需要內存之前,不會垃圾收集Counter對象。 Java中的軟引用使用java.lang.ref.SoftReference類表示。 您可以使用以下代碼在Java中創(chuàng)建SoftReference。
Counter prime = new Counter(); // prime holds a strong reference - line 2 SoftReference<Counter> soft = new SoftReference<Counter>(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory在將強引用設為空之后,在第2行上創(chuàng)建的Counter對象僅具有一個軟引用,該軟引用不能阻止對其進行垃圾回收,但可以延遲收集,這在WeakReference情況下非常渴望。 由于SoftReference和WeakReference之間的主要區(qū)別 ,SoftReference更適合于緩存,而WeakReference更適合于存儲元數據 。 WeakReference的一個方便示例是WeakHashMap,它是Map接口(例如HashMap或TreeMap )的另一種實現,但具有一個獨特的功能。 WeakHashMap將鍵包裝為WeakReference,這意味著一旦刪除了對實際對象的強引用,WeakHashMap內部存在的WeakReference便不會阻止它們被垃圾收集。
幻象引用是java.lang.ref包中提供的第三種引用類型。 幻影引用由java.lang.ref.PhantomReference類表示。 只要垃圾收集器喜歡,就可以收集僅具有指向它們的幻影引用的對象。 與WeakReference和SoftReference類似,您可以使用以下代碼創(chuàng)建PhantomReference:
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference - line 3 PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit); // phantom reference to object created at line 3digit = null;刪除“強引用”后,在第3行創(chuàng)建的DigitalCounter對象可以隨時進行垃圾回收,因為它僅具有一個指向它的PhantomReference,這不能阻止它進行GC處理。
除了了解WeakReference,SoftReference,PhantomReference和WeakHashMap之外,還有一個稱為ReferenceQueue的類值得一提。 您可以在創(chuàng)建任何WeakReference,SoftReference或PhantomReference時提供ReferenceQueue實例,如以下代碼所示:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanupDigitalCounter digit = new DigitalCounter(); PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);實例的引用將附加到ReferenceQueue,您可以通過輪詢ReferenceQueue來使用它執(zhí)行任何清理。 該圖很好地總結了對象的生命周期。
這就是Java中WeakReference和SoftReference之間的區(qū)別 。 我們還學習了引用類的基礎,例如Java和WeakHashMap和ReferenceQueue中的弱引用,軟引用和幻像引用。 仔細使用引用可以幫助進行垃圾回收,并在Java中實現更好的內存管理。
翻譯自: https://www.javacodegeeks.com/2014/03/difference-between-weakreference-vs-softreference-vs-phantomreference-vs-strong-reference-in-java.html
weakreference
總結
以上是生活随笔為你收集整理的weakreference_Java中WeakReference,SoftReference,PhantomReference和Strong Reference之间的区别...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 批处理另存为(批处理linux)
- 下一篇: 如何正确引导孩子学习 引导孩子学习的好方