標記 - 清除算法
“標記 - 清除”算法是最基礎的垃圾收集算法,如同它的名字一樣,算法的工作過程可以分為“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,然后統一回收所有被標記的對象。
標記待回收對象:使用可達性分析算法篩選出所有沒有可達鏈的對象。若對象覆蓋了finalize方法且虛擬機還沒有調用finalize方法,對象將被加入一個名為F-Queue的隊列,后續將由虛擬機創建一個名為Finalizer的線程,逐個執行F-Queue隊列每個對象的finalize方法。對象可以在finalize方法中和其他具有可達鏈的對象建立聯系,從而避免本次的垃圾收集。需要注意的是,任何對象的finalize方法只會被執行一次。
“標記 - 清除”算法主要存在兩個問題:
- 效率問題。標記和清除兩個過程的效率都不高。
- 空間問題。可能產生大量的不連續的內存碎片,進而導致空間利用率下降,垃圾收集頻率變高。
《深入理解Java虛擬機》筆記