判斷對象能否回收的兩種方法:引用計數算法,可達性分析算法
引用計數算法:給對象添加一個引用計數器,當該對象被其它對象引用時計數加一,引用失效時計數減一,計數為0時,可以回收。
特點:占用了一些額外的內存空間來進行計數,原理簡單,判定效率高
引用計數法簡單易實現,但無法解決循環引用的問題。
(這種引用情況下,A和B的計數器始終大于等于1。)
應用:引用計數法適用于對象生命周期較短、沒有循環引用的場景,
可達性分析算法:可以通過引用鏈到達“根”的對象存活,不可到達的對象可以回收。(這個“根” 名為GC Roots)
特點:能夠正確處理循環引用,但實現相對復雜,需要遞歸遍歷對象圖。
應用:可達性分析適用于長生命周期、存在循環引用的場景,
“引用” 概念的擴充
引用強度由高到低為:
強引用:傳統理解的“引用”,“Object obj=new Object()”,強引用類型的對象不會被回收。(new 關鍵字創建的對象)
軟引用:還有用,但非必須的對象,在系統將要內存溢出時會把它進行回收。(使用 SoftReference 類創建的引用)
弱引用:本次垃圾收集存活,但只能活到下一次垃圾收集為止。(使用WeakReference 類創建的引用)
虛引用:不會對對象的生存時間構成任何影響,唯一目的只是為了能在這個對象被收集器回收時收到一個通知。(使用 PhantomReference 類創建的引用)