西安公司注冊網站推廣軟件哪個好
目錄
- 1. 軟引用
- 軟引用的使用場景-緩存
- 2.弱引用
- 3.虛引用和終結器引用
可達性算法中描述的對象引用,一般指的是強引用,即是GCRoot對象對普通對象有引用關系,只要這層關系存在,
普通對象就不會被回收。除了強引用之外,Java中還設計了幾種其他引用方式:
? 軟引用
? 弱引用
? 虛引用
? 終結器引用
1. 軟引用
軟引用相對于強引用是一種比較弱的引用關系,如果一個對象只有軟引用關聯(lián)到它,當程序內存不足時,就會將軟引用中的數(shù)據進行回收。
在JDK 1.2版之后提供了SoftReference類來實現(xiàn)軟引用,軟引用常用于緩存中
軟引用的執(zhí)行過程如下:
- 1.將對象使用軟引用包裝起來,new SoftReference<對象類型>(對象)。
- 2.內存不足時,虛擬機嘗試進行垃圾回收。
- 3.如果垃圾回收仍不能解決內存不足的問題,回收軟引用中的對象。
- 4.如果依然內存不足,拋出OutOfMemory異常
軟引用中的對象如果在內存不足時回收,SoftReference對象本身也需要被回收。如何知道哪些SoftReference對象需要回收呢?
SoftReference提供了一套隊列機制: - 1、軟引用創(chuàng)建時,通過構造器傳入引用隊列
- 2、在軟引用中包含的對象被回收時,該軟引用對象會被放入引用隊列
- 3、通過代碼遍歷引用隊列,將SoftReference的強引用刪除
軟引用的使用場景-緩存
軟引用也可以使用繼承自SoftReference類的方式來實現(xiàn),StudentRef類就是一個軟引用對象。通過構造器傳入軟引用包含的對象,以及引用隊列。
使用軟引用實現(xiàn)學生數(shù)據的緩存:
軟引用如果被回收,要清理HashMap中的key。
2.弱引用
弱引用的整體機制和軟引用基本一致,區(qū)別在于弱引用包含的對象在垃圾回收時,不管內存夠不夠都會直接被回收。在JDK 1.2版之后提供WeakReference類來實現(xiàn)弱引用,弱引用主要在ThreadLocal中使用。
弱引用對象本身也可以使用引用隊列進行回收。
3.虛引用和終結器引用
? 這兩種引用在常規(guī)開發(fā)中是不會使用的。
?虛引用也叫幽靈引用/幻影引用,不能通過虛引用對象獲取到包含的對象。虛引用唯一的用途是當對象被垃圾回收器回收時可以接收到對應的通知。Java中使用PhantomReference實現(xiàn)了虛引用,直接內存中為了及時知道直接內存對象不再使用,從而回收內存,使用了虛引用來實現(xiàn)。
?終結器引用指的是在對象需要被回收時,終結器引用會關聯(lián)對象并放置在Finalizer類中的引用隊列中,在稍后由一條由FinalizerThread線程從隊列中獲取對象,然后執(zhí)行對象的finalize方法,在對象第二次被回收時,該對象才真正的被回收。在這個過程中可以在finalize方法中再將自身對象使用強引用關聯(lián)上,但是不建議這樣做。