(一)?????? 引用計數法
每有一個引用就加1,每失效一個就減1,為0表示可回收;但是此方法無法解決相互引用的情況
(二)?????? 根搜索算法
從一系列的GCRoots對象為起點向下搜索,搜索的路徑稱為引用鏈,當一個對象沒有任何引用鏈和GCRoots相連(也可以說成GCRoots到該對象不可達),則說明該對象可回收
1.????? 根搜索第一階段
1)?????? 與GCRoots之間沒有引用鏈將會被第一次標記
2)?????? 判斷此對象是否有必要執行finalize方法,以下是沒有必要執行情況:
l?? 對象沒有覆蓋finalize方法
l?? Finalize方法已經被虛擬機調用過
2.????? 兩個條件都滿足(必要執行finalize方法)后會被放入名為F-Quene的隊列中
l?? 由虛擬機自動建立的,低優先級的finalizer線程機會觸發,不等待執行結束,否則可能因為執行緩慢或死循環影響內存回收
l?? 除非再次被引用鏈連上,否則只能等待死亡
(三)?????? 引用
jdk1.2后分為:強引用,軟引用,弱引用,虛引用;強度逐漸減弱;垃圾回收器工作時無論內存是否足夠,都會回收只被弱引用關聯的對象
1.????? 強引用
l?? 必需對象,不會被回收
l?? 類似新創建的對象:Object obj=new Object()
2.????? 軟引用
l?? 非必需對象
l?? 軟引用關聯著的對象在要發生內存溢出之前會列為第二次回收對象,若內存仍然不足才會拋出內存溢出異常
3.????? 弱引用
l?? 非必需對象
l?? 弱引用關聯著的對象只能生存到下次垃圾收集前
4.????? 虛引用
l?? 也被稱為幽靈引用或幻影引用
l?? 設置虛引用的唯一目的就是希望關聯對象被回收時收到一個系統通知
l?? 不對對象生存時間產生影響,也無法被引用