垃圾回收算法的前世今生(轉)
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
垃圾回收算法的前世今生(轉)