- 強引用(StrongReference):
如果一個對象具有強引用略号,那垃圾回收器絕不會回收它,當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤玄柠,使程序異常終止突梦,也不會靠隨意回收具有強引用的對象來解決內存不足的問題;
Object o=new Object(); // 強引用 - 軟引用(SoftReference):
軟引用是用來描述一些有用但并不是必需的對象羽利,在Java中用java.lang.ref.SoftReference類來表示宫患。對于軟引用關聯(lián)著的對象,只有在內存不足的時候JVM才會回收該對象这弧。因此娃闲,這一點可以很好地用來解決OOM的問題,并且這個特性很適合用來實現緩存:比如網頁緩存匾浪、圖片緩存等皇帮。
軟引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對象被JVM回收蛋辈,這個軟引用就會被加入到與之關聯(lián)的引用隊列中属拾。下面是一個使用示例:
SoftReference<String> sr = new SoftReference<String>(new String("hello"));
System.out.println(sr.get()); - 弱引用(WeakReference)
弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時冷溶,無論內存是否充足渐白,都會回收被弱引用關聯(lián)的對象。在java中逞频,用java.lang.ref.WeakReference類來表示纯衍。下面是使用示例:
WeakReference<String> sr = new WeakReference<String>(new String("hello"));
System.out.println(sr.get());
4.虛引用(PhantomReference)
虛引用和前面的軟引用、弱引用不同虏劲,它并不影響對象的生命周期托酸。在java中用java.lang.ref.PhantomReference類表示。如果一個對象與虛引用關聯(lián)柒巫,則跟沒有引用與之關聯(lián)一樣励堡,在任何時候都可能被垃圾回收器回收。
要注意的是堡掏,虛引用必須和引用隊列關聯(lián)使用应结,當垃圾回收器準備回收一個對象時,如果發(fā)現它還有虛引用泉唁,就會把這個虛引用加入到與之 關聯(lián)的引用隊列中鹅龄。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收亭畜。如果程序發(fā)現某個虛引用已經被加入到引用隊列扮休,那么就可以在所引用的對象的內存被回收之前采取必要的行動。
引用隊列(Reference Queue):
一旦弱引用對象開始返回null拴鸵,該弱引用指向的對象就被標記成了垃圾玷坠。而這個弱引用對象(非其指向的對象)就沒有什么用了蜗搔。通常這時候需要進行一些清理工作。比如WeakHashMap會在這時候移除沒用的條目來避免保存無限制增長的沒有意義的弱引用八堡。
引用隊列可以很容易地實現跟蹤不需要的引用樟凄。當你在構造WeakReference時傳入一個ReferenceQueue對象,當該引用指向的對象被標記為垃圾的時候兄渺,這個引用對象會自動地加入到引用隊列里面缝龄。接下來,你就可以在固定的周期挂谍,處理傳入的引用隊列叔壤,比如做一些清理工作來處理這些沒有用的引用對象。
參考文章:
http://www.cnblogs.com/dolphin0520/p/3784171.html 基礎篇
https://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/ 深入理解篇