在學習面向對象時大家肯定知道GC,我們都知道無用的變量就是垃圾,那麼該何時回收,怎麼回收呢,我們今天來看一下。
標記清除
-
標記-清除算法將垃圾回收分爲兩個階段:標記階段和清除階段。
-
在標記階段首先通過根節點(GC Roots),標記所有從根節點開始的對象,未被標記的對象就是未被引用的垃圾對象。
-
在清除階段,清除所有未被標記的對象。
複製算法
從根集合節點進行掃描,標記出所有的存活對象,並將這些存活的對象複製到一塊兒新的內存(圖中下邊的那一塊兒內存)上去,之後將原來的那一塊兒內存(圖中上邊的那一塊兒內存)全部回收掉
標記整理
複製算法的高效性是建立在存活對象少、垃圾對象多的前提下的。
這種情況在新生代經常發生,但是在老年代更常見的情況是大部分對象都是存活對象。如果依然使用複製算法,由於存活的對象較多,複製的成本也將很高。
分代收集算法
分代收集算法就是目前虛擬機使用的回收算法,它解決了標記整理不適用於老年代的問題,將內存分爲各個年代。一般情況下將堆區劃分爲老年代(Tenured Generation)和新生代(Young Generation),在堆區之外還有一個代就是永久代(Permanet Generation)。
在不同年代使用不同的算法,從而使用最合適的算法,新生代存活率低,可以使用複製算法。而老年代對象存活率搞,沒有額外空間對它進行分配擔保,所以只能使用標記清除或者標記整理算法。