1. 程式人生 > >一步一步學JVM-垃圾回收算法

一步一步學JVM-垃圾回收算法

無法 程序 gen 適合 順序分配 存在 進行 大小 產生

標記-清除算法

算法分為標記和清除兩個階段:首先標記所有需要回收的對象,在標記完成後統一回收所有被標記的對象。

該算法存在的缺點:

  1、 效率問題:標記和清除兩個過程的效率都不高

  2、 空間問題:標記清除之後會產生大量不連續的內存碎片,內存碎片太多可能會倒是以後在程序運行過程中需要分配較大的對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾回收。

復制算法

為了解決回收效率問題,引出了復制算法。它將可用內存按照容量劃分為大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活的對象復制到另外一塊上面,然後把已經使用過的內存空間一次性清理掉。這樣每次回收都對整個半區進行回收,不用考慮內存碎片的復雜情況,只需要移動堆指針,按順序分配內存即可。

缺點:

這種算法的代價是將內存縮小為了原來的一半,浪費空間。

關於復制算法的更詳細講解可以參考:聊聊JVM的年輕代

標記-整理算法

復制算法對於在新生代這種對象存活率比較低的算法比較適合。但是對於老年代這種區域,效率會變低。所以在老年代中一般使用標記-整理算法

標記-整理算法中的標記和標記-清理中的標記時一樣的,但整理步驟不是對標記的對象直接進行清理,而是讓所有存活的對象都向一端移動,然後清理掉邊界以外的內存。

分代收集算法

分代收集算法根據對象存活周期將內存劃分為極快。一般是把Java的堆劃分為新生代和老年代,這樣就可以根據各個年代的特點采用最適當的收集算法。在新生代采用復制算法,在老年代采用“標記-清理”算法或者“標記-整理”算法進行回收。

一步一步學JVM-垃圾回收算法