天天看點

【對象的生死判定】

垃圾回收

JAVA有一個很大的好處就是,不用自己管理記憶體,虛拟機幫助開發者完成了這些操作。是以這是好是壞呢?不敢苟同。

對象生死

垃圾的定義:垃圾回收肯定是要知道怎麼定義垃圾。簡單點說就是,已經被用過了,并且不會再用了,而且還在記憶體裡面的對象,就是垃圾。因為他占着資源。

如何判斷垃圾:現在常用的兩種方法,引用計數法和可達性分析。

引用計數:這個其實是一個很不錯的方法,思想也很簡單,如果一個對象被引用了,那麼就給它的生命力++,如果引用它的人生命結束了,那麼它的生命就減一。最後看看誰生命值是0,那麼就判定他是垃圾。嗯,不錯的一個方案,實作起來也很簡單。

引用計數存在的問題:

【對象的生死判定】

但是在這種情況下,就不是很好了,這種情況被稱之為循環引用,A引用了B,B又引用了A,那麼他倆的生命力得到了對方的加持,一直不為0,就一直存活。

可達性分析:其實這種情況,抽象一下就是出現了環路。從圖論的角度來看,這個引用關系構成的圖應該是一個DAG(有向無環圖),一旦環路存在,那麼就會出現上述問題。繼續考慮,其實都考慮到圖論這來了,那麼這個問題的解就顯而易見了:所有的應用關系構成了有向圖,如果有些連通分量裡面的所有點都沒被用過,那麼這個連通分量可以被丢棄。

【對象的生死判定】

比如這個圖,左邊存在環路,右邊也可能存在。虛拟機中有一個GC ROOT,即使這些點的計數不為0,當GC ROOT不可達的時候,那麼這些連通分量裡面的對象依然會被回收。

死緩

繼續閱讀