GC垃圾回收算法 上

Java中的四中引用類型

  在學習GC垃圾回收算法以前,我先來了解一下Java中的引用類型。Java中有四種引用類型,分別是強引用(StrongReference)、軟引用(SoftReference)、弱引用(WeakReference)、虛引用(PhantomReference)。java

 

  強引用類型(StrongReference)

  Java中默認建立對象就是強引用類型,不會被GC回收,內存不足時,系統直接拋出OutOfMemoryError。(僞代碼以下)算法

Persion p = new Persion();

 

 

  軟引用類型(SoftReference)

       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垃圾回收對軟引用不能進行回收的。學習

 

弱引用(WeakReference)

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;

 

虛引用類型(PhantomeReference)

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

 

引用隊列(ReferenceQueue)

引用隊列能夠與軟引用、弱引用以及虛引用一塊兒配合使用,當垃圾回收器準備回收一個對象時,若是發現它還有引用,那麼就會在回收對象以前,把這個引用加入到與之關聯的引用隊列中去。

程序能夠經過判斷引用隊列中是否已經加入了引用,來判斷被引用的對象是否將要被垃圾回收,這樣就能夠在對象被回收以前採起一些必要的措施。

相關文章
相關標籤/搜索