java虛擬機(二)JAVA虛擬機中的垃圾收集算法

垃圾收集算法

  • 標記-清除算法
  • 複製算法
  • 標記-整理算法
  • 分代收集算法

1. 標記-清除(Mark-Sweep)算法

  • 最基礎的垃圾收集算法,後續的收集算法都是基於這中思路並對其不足進行改進而得到的
  • 算法分爲"標記","清除"兩個階段,首先標記出所有需要回收的對象,在標記完成後統一回收掉所有被標記的對象
標記-清除算法的缺點
  • 分配效率較低:如果是一塊連續的內存空間,那麼我們可以通過指針加法來做分配,而對於空閒列表,java虛擬機需要逐個訪問列表中的項,來查找能夠放入新建對象的空閒內存
  • 空間問題:標記清除之後會產生大量不連續的內存碎片,空間碎片太多可能會導致以後在程序運行過程中需要分配較大對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾收集動作

2. 複製算法

  • 將可用的內存容量劃分爲大小相等的兩塊,每次只使用其中的一塊
  • 當這一塊的內存用完了,就將還存活着的對象複製到另外一塊上面,然後再把已使用過的內存空間一次清理掉
複製算法的優點

實現簡單,運行高效

  • 每次都是對整個半區進行內存回收,內分分配時也就不用考慮內存碎片化的情況
  • 只要移動堆頂指針,按順序分配內存即可
複製算法的缺點
  • 內存縮小爲了原來的一半
複製算法的使用場景

使用這種收集算法來回收新生代

3. 標記-整理算法

  • 標記整理算法在標記-清除算法基礎上做了改進
  • 標記階段是相同的標記出所有需要回收的對象
  • 在標記完成後不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,在移動過程中清理掉可回收的對象,這個過程叫整理
標記-整理算法的優點

相比標記-清除算法:內存整理後不會產生大量不連續內存碎片問題

標記-整理算法的缺點

在對象存活率高的情況下就要執行較多的複製操作,效率將會變低,而在對象存活率高的情況下使用"標記-整理"算法效率會大大提高

4. 分代收集算法

  • 此算法就是將上述三種算法整合了
  • 根據對象存活週期的不同將內存劃分爲幾塊,一般是把java 堆,分爲新生代和年老代,這樣就可以根據各個年代的特點採取最適當的收集算法
  • 在新生代中,每次垃圾手機時都發現有大批對象死去,只有少量存活,那就選用複製算法,只需要付出少量存活對象的複製成本就可以完成收集
  • 而老年代中因爲對象存活率高,沒有額外空間對它進行分配擔保,就必須使用 “標記-清除” 或者 “標記-整理” 算法來進行回收

現在的垃圾回收器往往會綜合上述集中回收方式,綜合它們的優點的同時規避它們的缺點

垃圾收集算法的應用:垃圾收集器可以說是垃圾收集算法的應用,可以看下一篇java虛擬機(三)垃圾收集器

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