1. 程式人生 > >虛擬機回收小結

虛擬機回收小結

內存 mil luci weight mar cms UC 引用計數器 point

java區別去C、C++最大的特點就是垃圾回收

垃圾回收主要要點:

1、回收算法(回收哪些對象)

2、回收器(怎麽回收)

查找垃圾對象

  1、引用計數

    每個對象都包含一個引用計數器,表示該對象被引用的次數,如果為0,則表示為遊離對象,可以被回收;

    不能解決環形引用。

  2、根搜索

    根據一批根對象搜索引用的所有對象、以及整個引用鏈上的對象,未在引用鏈上的對象就是垃圾對象。

回收算法

    標記-回收:標記根對象(一批)能到達的對象,回收剩下的對象。(簡單、磁盤碎片多)

    標記-復制:同標記-回收的標記一樣,將堆劃分為兩塊區域,當需要回收時,會將存活的對象拷貝到新的區域,然後回收所有舊的區域。(回收效率高、空間浪費)

    標記-整理:同標記-回收大致一樣,只是在回收前會將存活的對象移動到內存的一端,然後回收剩下的垃圾數據。(節約空間、回收效率高)

回收器

  A、串行

    Serial(復制)、Serial-Old(標記-整理)

    默認client模式會使用,stop the world

  B、並發

    ParNew 是 Serial的多線程版本

    Parallel Scanvenge(復制算法) 和 Parallel Old

    Concurrent Mark Sweep:基於標記-清除算法、低停頓(3次標記(stop the world)、清除);CPU敏感、浮動垃圾無法處理、內存碎片需要FULL GC來幫助清理。

  C、G1 Garbage First 低停頓、高吞吐。會stop the world

    將內存換分為新生代、老年代後,在切分成不同的塊(Region)

    新生代會暫停所有應用,然後將對象拷貝到存活區或者老年代,老年代也是通過拷貝的方式來完成清理,能有效的控制磁盤碎片。

    當磁盤空間不足時會降級到Serial回收方式。

    Humongous區,為大對象分配區域,一般為連續的內存塊。

    新生代和老年代引用問題:CMS 通過 point out,通過一塊內存記錄所有老年代指向新生代的對象應用;G1已經分片切塊,不需要記錄所有的老年代引用,所以提出了point in 概念,只存取老年代到新生代某塊的引用,可以降低掃描整個老年代的問題。

    G1 的mix GC 算法也是:標記-拷貝,在標記時同CMS一樣也會Stop the world,清理階段也會Stop the world。

    G1 新提出了三色標記算法:

      黑色:根對象或它的子對象已經被掃描

      灰色:本身被掃描、還沒掃描完該對象的子對象

      白色:未被掃描的對象或垃圾對象

    

    

    

成都市高新區天府軟件園C區C2-101號

虛擬機回收小結