7.6.4 標記並壓縮(Mark and Compact)垃圾回收算法

標記並壓縮(Mark and Compact)是一種垃圾回收算法,用於回收不再被程序使用的內存。與標記-清掃式算法不同,標記並壓縮算法將標記和清理階段合併爲一個階段,這樣可以避免在清理階段中的碎片化問題,並且可以在原地對存活對象進行壓縮,減少了內存的碎片化。

以下是標記並壓縮算法的基本步驟:

  1. 標記階段: 從根對象(如全局變量、棧中的引用等)開始,通過遍歷對象圖,標記所有可達的對象。可達的對象是指那些從根對象出發,可以通過引用鏈到達的對象。所有被標記的對象被視爲存活對象。

  2. 壓縮階段: 在標記階段完成後,壓縮階段開始。在這個階段,垃圾回收器會遍歷堆內存,將存活的對象移動到一端,並且緊湊地排列,使得它們之間沒有空隙。這個過程通常包括兩個步驟:

    • 移動對象: 垃圾回收器會將存活的對象移動到堆內存的一端,使得它們連續存放,這樣可以減少內存的碎片化,並且提高內存的利用率。

    • 更新引用: 在移動對象的同時,需要更新所有對這些對象的引用,以確保它們指向對象的新位置。

  3. 回收階段: 在壓縮階段完成後,剩餘的內存空間就是垃圾對象所佔用的空間。垃圾回收器可以簡單地將這部分內存標記爲可用空間,以供後續的對象分配使用。

標記並壓縮算法的優點是可以解決內存碎片化的問題,提高內存的利用率,並且在壓縮階段中可以對存活對象進行緊湊排列,有利於提高內存訪問的局部性。然而,標記並壓縮算法的缺點是需要額外的時間和空間開銷來移動對象和更新引用,可能會導致垃圾回收的停頓時間較長。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章