1. 程式人生 > >GC原理---垃圾收集算法

GC原理---垃圾收集算法

沒有 碎片 進行 而是 原理 回收 兩個 可用 產生

垃圾收集算法

Mark-Sweep(標記-清除算法)
  • 標記清除算法分為兩個階段,標記階段和清除階段。標記階段任務是標記出所有需要回收的對象,清除階段就是清除被標記對象的空間。
  • 優缺點:實現簡單,容易產生內存碎片。因為會存在大量的空間碎片,因為回收後的空間是不連續的,這樣給大對象分配內存的時候可能會提前觸發full gc。
標記-壓縮算法
  • 首先也需要從根節點開始對所有可達對象做一次標記,但之後,它並不簡單地清理未標記的對象,而是將所有的存活對象壓縮到內存的一端。之後,清理邊界外所有的空間。這種方法既避免了碎片的產生,又不需要兩塊相同的內存空間,因此,其性價比比較高。
  • 標記-壓縮算法是一種老年代的回收算法,它在標記-清除算法的基礎上做了一些優化。
  • 優缺點:不容易產生內存碎片;內存利用率高;存活對象多並且分散的時候,移動次數多,效率低下
復制算法
  • 將現有的內存空間分為兩快,每次只使用其中一塊,在垃圾回收時將正在使用的內存中的存活對象復制到未被使用的內存塊中,之後,清除正在使用的內存塊中的所有對象,交換兩個內存的角色,完成垃圾回收。
  • 優缺點:不容易產生內存碎片;可用內存空間少;存活對象多的話,效率低下。
分代收集算法
  • 當前商業虛擬機的垃圾收集都采用“分代收集”算法,該算法根據對象存活周期的不同,將內存劃分為幾塊。一般把java堆劃分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的算法。
  • 在新生代中,每次垃圾收集都發現有大批對象死去,只有少量存活,那就采用復制法,只需要付出少量存活對象的復制成本就可以完成收集
  • 而老年代中對象存活率高,沒有額外空間對它進行分配擔保,就必須采用“標記-清除”算法或“標記-整理”算法來進行回收。

GC原理---垃圾收集算法