1. 程式人生 > >垃圾回收算法的前世今生(轉)

垃圾回收算法的前世今生(轉)

如果 內存回收 碎片 新生代 大片 全面 堆區 邊界 垃圾回收

1.引用計數法(java未采用)

2.標記-清除算發(jvm老年回收)

3.標記-壓縮算發(jvm老年回收)

4.復制算法(jvm新生代回收)

標記-清除算法

標記-清掃式垃圾回收器是一種直接的全面停頓算法。簡單的說,它們找出所有不可達的對象,並將它們放入空閑列表Free。

清掃過程將分為標記階段和清掃階段

缺點:需要掃描整個堆區,時間開銷較大。

標記壓縮算法:

①標記階段,通過根節點標記所有可達(直接或間接可訪問)對象,和標記-清除法類似;

②清除階段,將上一輪存活對象壓縮到內存的一端,之後清理邊界。

優點:可以減少內存碎片,避免分配大對象時空間不夠。

復制算法:

它將堆上的內存分為兩個大小相等的區域,一個是空閑區域,一個是活動區域。在程序運行中,實際使用的是活動區域,也就是有50%的空間被浪費掉。

實現過程:1.找出活動空間中所有存活的對象。2.將這些存活的對象復制到空閑區域。3.將之前的活動空間清空,然後,就變為空閑空間了,而存活對象所在的區域,則變為活動空間了。

優點,就是,內存回收完畢後,有一大片連續的可用空間。缺點,當然是,在程序運行期間,有50%的內存空間被放著,只有在發生內存回收的時候,GC才會借用空閑區域來實現內存回收工作。

復制算法與標記-壓縮法對比:

復制收集算法在對象存活率較高時就要執行較多的復制操作,效率將會變低。更關鍵的是,如果不想浪費50%的空間,就需要有額外的空間進行分配擔保,以應對被使用的內存中所有對象都100%存活的極端情況,所以復制算法僅僅應用在新生代,而老年代一般不能直接選用這種算法,使用標記-壓縮法。

標記-壓縮法與標記-清除法對比:

根據老年代的特點,有人提出了“標記-壓縮”(Mark-Compact)算法,標記過程仍然與“標記-清除”算法一樣,但後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的內存。也可以減少內存碎片。

參考資料來源:

http://www.cnblogs.com/ttylinux/p/3886561.html

https://blog.csdn.net/m0_37860933/article/details/82154989

垃圾回收算法的前世今生(轉)