這裏先引用一篇文章
https://www.cnblogs.com/wjh123/p/11142176.html
強引用:鍵字new創建的對象所關聯的引用就是強引用。只要還存在引用關係,gc就不會隨意回收對象。如下圖
public class StrongReference {
public static void main(String[] args) {
Object o = new Object();
System.gc();
System.out.println(o.toString());
}
}
通過測試發現在有強引用關係時,就算調用gc回收,對象還是依舊存在的。
如果代碼修改成
public class StrongReference {
public static void main(String[] args) {
Object o = new Object();
System.gc();
o = null ;
System.out.println(o.toString());
}
}
測試發現會報空指針
軟引用:通過SoftReference類實現。
軟引用的生命週期比強引用短一些可以把軟引用的對象理解爲把對象"緩存"起來 在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍進行第二次回收。如果這次回收還沒有足夠的內存,纔會拋出內存溢出異常
弱引用:弱引用通過WeakReference類實現。 ThreadLocal 裏面的Entry就使用了弱引用
弱引用的生命週期比軟引用短。垃圾回收時,如果這個對象只被弱引用關聯(沒有任何強引用關聯他),無論內存是否足夠,這個對象都會被回收。
虛引用:通過PhantomReference類來實現,用來管理堆外內存。當gc準備回收一個對象時,如果發現它還有虛引用,就會在回收對象的內存之前,把這個虛引用加入到與之關聯的引用隊列中,如下圖。程序通過判斷queue中是否存在該虛引用,如果存在,垃圾回收器就可以對堆外內存的對象進行回收。