【快速入門JVM】Java虛擬機規範之(分代收集算法)4大GC算法

  GC的作用範圍是方法區和堆區,次數上頻繁收集Young區、次數上頻繁收集Old區、基本不動Perm區(特殊情況也會清除永久區)。

  JVM在進行GC時,並非每次都對三個內存區域一起回收的,大部分時候回收的都是指新生代。
所以GC按照回收的區域又分了兩種類型,一種是普通GC(minor GC),一種是全局GC(major GC or Full GC)
  普通GC(minor GC):只針對新生代區域的GC。
  全局GC(major GC or Full GC):針對年老代的GC,偶爾伴隨對新生代的GC以及對永久代的GC。

一、引用計數法(廢棄)

  一旦對象被引用,就開始計數。無引用,計數器就自減,減至0就會被垃圾回收。

  JVM的GC一般都不使用這種方式,因爲它每次對對象賦值時,都要維護引用計數器,且計算器本身有一定的消耗;其次很難處理循環引用。

二、複製算法(Coping)

  年輕代中使用普通GC,這種GC算法採用的就是複製算法。

(1)基礎原理

  HotSpot JVM把年輕代分爲了三部分:1個Eden區和2個Survivor區(分別叫from和to),比例是8:1:1。

  Minor GC會把Eden(伊甸區)中的所有活的對象都移到Survivor區域中,如果Survivor區中放不下,那麼剩下的活的對象就被移到Old generation(養老區)中,此時Eden是就變成空的了。

(2)優缺點
比較 描述
優點 掃描一次就直接複製過去,效率高;挪動的對象相連,無內存碎片
缺點 需要雙倍空間,浪費內存
(3)動圖演示

三、標記清除(Mark-Sweep)

老年代一般是由標記清除或者是標記清除與標記整理的混合實現!

(1)基礎原理

  當堆中的有效內存空間被耗盡時,就會停止整個程序(stop the world),然後進行兩項工作,第一項則是標記,第二項則是清除。
   標記:從引用根節點開始標記所有被引用的對象。標記的過程其實就是遍歷所有的GC Roots,然後將所有GC Roots可達的對象 標記爲存活的對象。
  清除:遍歷整個堆,把未標記的對象清除。

(2)優缺點
比較 描述
優點 不需要額外的內存空間
缺點 標記時需要暫停整個應用,會產生內存碎片(空閒內存不連續);掃描兩次,比較耗時
(3)動圖演示

四、標記壓縮/標記整理(Mar k-Compact)

老年代一般是由標記清除或者是標記清除與標記整理的混合實現

(1)基礎原理

  在整理壓縮階段,不再對標記的對像做回收,而是通過所有存活對像都向一端移動,然後直接清除邊界以外的內存(標記的存活對象將會被整理,按照內存地址依次排列,而未被標記的內存會被清理掉)。

##### (2)優缺點
比較 描述
優點 彌補標記/清除算法內存區域分散的缺點,消除了複製算法內存減半的高額代價
缺點 效率不高,不僅標記所有存活對象,還要整理所有存活對象的引用地址,效率低於複製算法

五、標記清除壓縮(Mark-Sweep-Compact)

標記清除(Mark-Sweep)與標記壓縮/標記整理(Mar k-Compact)的結合!減少了移動對象的成本。

總結
  (1)內存效率:複製算法(最快)>標記清除算法>標記整理算法(此處的效率只是簡單的對比時間複雜度,實際情況不一定如此)。
  (2)內存整齊度:複製算法=標記整理算法>標記清除算法。
  (3)內存利用率:標記整理算法=標記清除算法>複製算法。


 ☝上述分享來源個人總結,如果分享對您有幫忙,希望您積極轉載;如果您有不同的見解,希望您積極留言,讓我們一起探討,您的鼓勵將是我前進道路上一份助力,非常感謝!我會不定時更新相關技術動態,同時我也會不斷完善自己,提升技術,希望與君同成長同進步!

☞本人博客:https://coding0110lin.blog.csdn.net/  歡迎轉載,一起技術交流吧!

發佈了163 篇原創文章 · 獲贊 40 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章