說到 Java 虛擬機不得不提的一個詞就是“垃圾回收”(GC,Garbage Collection),而垃圾回收的執行速度則影響着整個程序的執行效率,所以我們需要知道更多關於垃圾回收的具體執行細節,以便爲我們選擇合適的垃圾回收器提供理論支持。
我們本課時的面試題是,如何判斷一個對象是否“死亡”?垃圾回收的算法有哪些?
典型回答
垃圾回收器首先要做的就是,判斷一個對象是存活狀態還是死亡狀態,死亡的對象將會被標識爲垃圾數據並等待收集器進行清除。
判斷一個對象是否爲死亡狀態的常用算法有兩個:引用計數器算法和可達性分析算法。
引用計數算法(Reference Counting) 屬於垃圾收集器最早的實現算法了,它是指在創建對象時關聯一個與之相對應的計數器,當此對象被使用時加 1,相反銷燬時 -1。當此計數器爲 0 時,則表示此對象未使用,可以被垃圾收集器回收。
引用計數算法的優缺點很明顯,其優點是垃圾回收比較及時,實時性比較高,只要對象計數器爲 0,則可以直接進行回收操作;而缺點是無法解決循環引用的問題,比如以下代碼:
class CustomOne {
private CustomTwo two;
public CustomTwo getCustomTwo() {
return two;
}
public void setCustomTwo(CustomTwo two) {
this.two = two;
}
}
class CustomTwo {
private CustomOne one;
public CustomOne getCustomOne() {
return one;
}
public void setCustomOne(CustomOne one) {
this.one = one;