一、引用基類
Reference是所有引用對象的基類,引用對象的實現(xiàn)都是與GC操作相關(guān)的。
二、引用分類
1、強引用(Strong Reference)
? 簡單來說,形如?A a= new A()格式,此時a就是強引用,即使jvm內(nèi)存不足拋出OutOfMemoryError錯誤,也不會被回收的對象
2、軟引用(Soft Reference)
? 強度僅次于Strong Reference的引用類型,jvm內(nèi)存足夠時不會回收該類型對象,內(nèi)存不夠快要OutOfMemoryError之前才會嘗試進行回收該類型引用對象。
注:只要垃圾回收器沒有回收它,該對象就可以被程序使用。結(jié)合ReferenceQueue一起使用,
ReferenceQueue queue = new ReferenceQueue ();
SoftReference sr = new SoftReference(object, queue);
即可在快要被回收前再次獲取該對象的強應(yīng)用,避免被回收。
Object obj = sr.get();
? 軟引用最常見的使用場景是可用來實現(xiàn)內(nèi)存敏感的高速緩存。
3、弱引用(Weak Reference)
? 弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短暫的生命周期。
? GC線程一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當(dāng)前內(nèi)存空間足夠與否,都會回收它的內(nèi)存。不過,由于垃圾回收器是一個優(yōu)先級很低的線程,因此不一定會很快發(fā)現(xiàn)那些只具有弱引用的對象。
4、虛引用(Phantom Reference)
? 最顯著的特點是始終無法通過get()獲取到所引用的對象,并且不像軟引用、弱引用會自動回收內(nèi)存,虛引用的存在(雖然內(nèi)存還是會被回收)更傾向于發(fā)送通知,當(dāng)一個對象確定會被回收之后(此時虛引用中的引用對象并不能確定是否已經(jīng)被回收內(nèi)存了,而軟引用和弱引用一定是被回收內(nèi)存了的),就會向應(yīng)用程序發(fā)送一個通知(進入隊列和出隊列)
三、Reference和ReferenceQueue
一句話概括ReferenceQueue是jvm底層的GC程序與上層應(yīng)用程序溝通的橋梁,當(dāng)GC修改不可達對象的狀態(tài)后,會入ReferenceQueue隊列,應(yīng)用可根據(jù)隊列信息進行相對應(yīng)的處理