在學習GC垃圾回收算法以前,我先來了解一下Java中的引用類型。Java中有四種引用類型,分別是強引用(StrongReference)、軟引用(SoftReference)、弱引用(WeakReference)、虛引用(PhantomReference)。java
Java中默認建立對象就是強引用類型,不會被GC回收,內存不足時,系統直接拋出OutOfMemoryError。(僞代碼以下)算法
Persion p = new Persion();
JDK 1.2 以後,用 java.lang.ref.SoftReference 類表示軟引用。軟引用通常用在一些緩存技術(網頁緩存、圖片緩存等),軟引用在內存充足時,不會被GC回收,只有在內存不足時,系統纔會進行GC回收。(僞代碼以下)緩存
private static void test(){ Persion p = new Persion(); //建立一個軟引用 SoftRerefence<Persion> ps = new SoftRerefence<>(p); System.out.println(ps.get()); //進行垃圾回收 System.gc(); p = null;
System.gc(); System.out.println(ps.get()); }
輸出結果ide
Persion{name=null}; ------------------ Persion{name=null};
所以,在內存充足時,GC垃圾回收對軟引用不能進行回收的。學習
JDK1.2 以後,用 java.lang.ref.WeakReference 來表示弱引用,弱引用比軟引用要更弱一些,弱引用不管是在內存充足仍是內存不足時,只要GC進行一次垃圾回收,這是弱引用類型都能被GC回收。對象
private static void test(){ Persion p = new Persion(); //建立一個弱引用 WeakRerefence<Persion> wr = new WeakRerefence<>(p); System.out.println(wr.get()); //進行垃圾回收 //先進行對象置空,在進行GC回收 p = null; System.gc(); System.out.println(wr.get()); }
輸出結果隊列
Person{name=null}; null;
JDK1.2 以後,用 PhantomReference 類來表示,,虛引用是最弱的一種引用關係,若是一個對象僅持有虛引用,它就和沒有任何引用同樣,它隨時可能會被回收。圖片
private static void test(){ Persion p = new Persion(); //建立一個弱引用 PhantomeRerefence<Persion> pr = new PhantomeRerefence<>(p); System.out.println(pr.get()); //進行垃圾回收 //先進行對象置空,在進行GC回收 //p = null; //System.gc(); System.out.println(pr.get()); }
輸出結果內存
null; null;
注意:虛引用必需要和 ReferenceQueue 引用隊列一塊兒使用。get
引用隊列能夠與軟引用、弱引用以及虛引用一塊兒配合使用,當垃圾回收器準備回收一個對象時,若是發現它還有引用,那麼就會在回收對象以前,把這個引用加入到與之關聯的引用隊列中去。
程序能夠經過判斷引用隊列中是否已經加入了引用,來判斷被引用的對象是否將要被垃圾回收,這樣就能夠在對象被回收以前採起一些必要的措施。