1. 強引用 只有所有 GC Roots 對象都不通過【強引用】引用該對象,該對象才能被垃圾回收
? ? ? ? ? ? ? 由GC Root直接new出來的對象是強引用,只有當GC Root不再引用該對象的時候,才會被回收
例子:
List<String> list = new ArrayList<>();list=null;//不再引用ArrayList,下一次垃圾回收觸發就會回收掉ArrayList
2. 軟引用(SoftReference) 僅有軟引用引用該對象時,在垃圾回收后,內存仍不足時會再次出發垃圾回收,回收軟引用對象 可以配合引用隊列來釋放軟引用自身
軟引用可以理解為沒有被GC Root直接引用,而是通過強引用的對象間接引用
如果a,b兩個GC Root針對對象c,a?對c為軟引用,b對c為強引用,這個時候發生垃圾回收并且在內存不足時,是不會回收掉c的,只有當b對c的引用失效時才會進行清除
3. 弱引用(WeakReference) 僅有弱引用引用該對象時,在垃圾回收時,無論內存是否充足,都會回收弱引用對象 可以配合引用隊列來釋放弱引用自身
軟引用和弱引用本身都是對象會占用內存空間,可以配合引用隊列,將軟引用和弱引用的對象清理后放入引用隊列,之后就可以遍歷清除釋放內存
?
4. 虛引用(PhantomReference) 必須配合引用隊列使用,主要配合 ByteBu?er 使用,被引用對象回收時,會將虛引用入隊, 由 Reference Handler 線程調用虛引用相關方法釋放直接內存
?
5. 終結器引用(FinalReference) 無需手動編碼,但其內部配合引用隊列使用,在垃圾回收時,終結器引用入隊(被引用對象 暫時沒有被回收),再由 Finalizer 線程通過終結器引用找到被引用對象并調用它的 ?nalize方法,第二次 GC 時才能回收被引用對象