JAVA GC 虛擬機垃圾回收算法

  • 引用計數(Reference Counting)
    比較古老的回收算法。原理是此對象有一個引用,即增長一個計數,刪除一個引用則減小一個計數。垃圾回收時,只用收集計數爲0的對象。此算法最致命的是沒法處理循環引用的問題。
    web

  • 標記-清除(Mark-Sweep)
    此算法執行分兩階段。第一階段從引用根節點開始標記全部被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。此算法須要暫停整個應用,同時,會產生內存碎片。
    算法

  • 複製(Copying)
    此算法把內存空間劃爲兩個相等的區域,每次只使用其中一個區域。垃圾回收時,遍歷當前使用區域,把正在使用中的對象複製到另一個區域中。次算法每次只處理正在使用中的對象,所以複製成本比較小,同時複製過去之後還能進行相應的內存整理,不過出現"碎片"問題。固然,此算法的缺點也是很明顯的,就是須要兩倍內存空間。
    spa

  • 標記-整理(Mark-Compact)
    此算法結合了"標記-清除"和"複製"兩個算法的優勢。也是分兩階段,第一階段從根節點開始標記全部被引用對象,第二階段遍歷整個堆,把清除未標記對象而且把存活對象"壓縮"到堆的其中一塊,按順序排放。此算法避免了"標記-清除"的碎片問題,同時也避免了"複製"算法的空間問題。
    orm

  • 增量收集(Incremental Collecting)
    實施垃圾回收算法,即:在應用進行的同時進行垃圾回收。不知道什麼緣由JDK5.0中的收集器沒有使用這種算法的。
    對象

  • 分代(Generational Collecting)
    基於對對象生命週期分析後得出的垃圾回收算法。把對象分爲年青代、年老代、持久代,對不一樣生命週期的對象使用不一樣的算法(上述方式中的一個)進行回收。如今的垃圾回收器(從J2SE1.2開始)都是使用此算法的。
    生命週期


  • GC有兩種類型:Scavenge GCFull GC內存

    • Tenured被寫滿 ci

    • Perm域被寫滿 rem

    • System.gc()被顯示調用 it

    • 上一次GC以後Heap的各域分配策略動態變化

    • Scavenge GC
      通常狀況下,當新對象生成,而且在Eden申請空間失敗時,就好觸發Scavenge GC,堆Eden區域進行GC,清除非存活對象,而且把尚且存活的對象移動到Survivor區。而後整理Survivor的兩個區。

    • Full GC對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,所以應該儘量減小Full GC。有以下緣由可能致使Full GC:

相關文章
相關標籤/搜索