虛擬機回收小結
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號
虛擬機回收小結