1、強引用
強引用,是在我們的開發工作當中普遍存在的。如果一個對象具有強引用,那就類似我們經常穿的衣服啊等必不可少的生活用品,我們肯定不會把他扔掉,同樣jvm的垃圾回收器也不會回收它。當內存空間不足的時候,java虛擬機寧可拋出OOM異常,也不會回收具有強引用的對象來釋放內存。我們可以將對象顯示的賦值為null,則gc認為該對象不存在引用,這時就可以回收這個對象。具體什么時候收集這要取決於gc的算法。也就是說方法的內部有一個強引用,這個引用保存在棧中,而真正的引用內容(Object)保存在堆中。當這個方法運行完成后就會退出方法棧,則引用內容的引用不存在,這個Object會被回收。
2、軟引用
SoftReference:是比強引用弱化的引用,可以讓對象豁免一些垃圾回收,軟引用通常在對內存比較敏感的程序中,例如高速緩存區,mybatis就是用到了該方式。他的特點就是 存充足的時候不被回收,內存不足時才被回收。

package com.jalja.java.reference; import java.lang.ref.SoftReference; /** * @Auther: XL * @Date: 2019/12/24 07:50 * @Description: */ public class SoftReferenceTest { public static void main(String [] args) throws Exception{ //softReferenceAmple(); softReferenceNotAmple(); } /** * 內存充足 */ private static void softReferenceAmple(){ Object o=new Object(); SoftReference<Object> reference=new SoftReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; System.gc(); System.out.println(o); System.out.println(reference.get()); } /** * 內存不足就回收 */ private static void softReferenceNotAmple(){ Object o=new Object(); SoftReference<Object> reference=new SoftReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; try { byte[]bytes=new byte[30*1024*1024]; }finally { System.out.println(o); System.out.println(reference.get()); } } }
3、弱引用
WeakReference:無論內存是否足夠,只要發生GC 弱引用的對象一定被回收

package com.jalja.java.reference; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.WeakHashMap; /** * @Auther: XL * @Date: 2019/12/24 08:02 * @Description: */ public class WeakReferenceTest { public static void main(String [] args) throws Exception{ weakReferenceTest(); } /** * 內存充足 */ private static void weakReferenceTest(){ Object o=new Object(); WeakReference<Object> reference=new WeakReference<>(o); System.out.println(o); System.out.println(reference.get()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); } private static void weakHashMapTest(){ WeakHashMap<String,Object> weakHashMap=new WeakHashMap<>(); } }
WeakHashMap:
4、虛引用
PhantomReference:
public static void main(String [] args) throws Exception{ Object o=new Object(); ReferenceQueue<Object> queue=new ReferenceQueue(); PhantomReference<Object> reference=new PhantomReference<>(o,queue); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); }
引用隊列:ReferenceQueue
package com.jalja.java.reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; /** * @Auther: XL * @Date: 2019/12/24 08:28 * @Description: ReferenceQueue 引用隊列,在GC后悔保留對象的引用 */ public class ReferenceQueueTest { public static void main(String [] args) throws Exception{ Object o=new Object(); ReferenceQueue<Object> queue=new ReferenceQueue(); WeakReference<Object> reference=new WeakReference<>(o,queue); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); o=null; System.gc(); System.out.println("==========GC========="); System.out.println(o); System.out.println(reference.get()); System.out.println(queue.poll()); } }