根搜尋算法
根搜尋算法是從離散數學中的圖論引入的,程式把所有引用關系看作一張圖,從一個節點GC ROOT 開始,尋找對應的引用節點,找到這個節點後,繼續尋找這個節點的引用節點。當所有的引用節點尋找完畢後,剩餘的節點則被認為是沒有被引用到的節點,即無用的節點。

上圖紅色為無用的節點,可以被回收。
目前Java中可以作為GC ROOT的對象有:
1、虛拟機棧中引用的對象(本地變量表)
2、方法區中靜态屬性引用的對象
3、方法區中常量引用的對象
4、本地方法棧中引用的對象(Native對象)
基本所有GC算法都引用根搜尋算法這種概念。
标記 - 清除算法
标記-清除算法采用從根集合進行掃描,對存活的對象進行标記,标記完畢後,再掃描整個空間中未被标記的對象進行直接回收,如上圖。
标記-清除算法不需要進行對象的移動,并且僅對不存活的對象進行處理,在存活的對象比較多的情況下極為高效,但由于标記-清除算法直接回收不存活的對象,并沒有對還存活的對象進行整理,是以會導緻記憶體碎片。
複制算法
複制算法将記憶體劃分為兩個區間,使用此算法時,所有動态配置設定的對象都隻能配置設定在其中一個區間(活動區間),而另外一個區間(空間區間)則是空閑的。
複制算法采用從根集合掃描,将存活的對象複制到空閑區間,當掃描完畢活動區間後,會的将活動區間一次性全部回收。此時原本的空閑區間變成了活動區間。下次GC時候又會重複剛才的操作,以此循環。
複制算法在存活對象比較少的時候,極為高效,但是帶來的成本是犧牲一半的記憶體空間用于進行對象的移動。是以複制算法的使用場景,必須是對象的存活率非常低才行,而且最重要的是,我們需要克服50%記憶體的浪費。
标記 - 整理算法
标記-整理算法采用 标記-清除 算法一樣的方式進行對象的标記、清除,但在回收不存活的對象占用的空間後,會将所有存活的對象往左端空閑空間移動,并更新對應的指針。标記-整理 算法是在标記-清除 算法之上,又進行了對象的移動排序整理,是以成本更高,但卻解決了記憶體碎片的問題。
JVM為了優化記憶體的回收,使用了分代回收的方式,對于新生代記憶體的回收(Minor GC)主要采用複制算法。而對于老年代的回收(Major GC),大多采用标記-整理算法。