GC停顿:拷贝算法中,对象地址会发生移动,让业务线程全部停下来,等GC完成对象地址的调整后再工作。
并发:Concurrent 指GC线程和业务线程同时工作。
并行:Parallel 指多个GC线程同时工作。
1.分代垃圾回收算法
原理:将堆分为年轻代和老年代,年轻代使用copy算法scavenge,老年代使用mark-sweep
晋升:年轻代发生GC频率高于老年代,每经历一次GC存活下来的对象age+1,当age大于Max时,被复制到老年代,参数默认是15
CardTable:避免老年代对象全部描述,引入来标记该区域老年代对象指向年轻代的指针,本质是一个位图。512字节
维护跨代引用;标记灰色节点。
2.0三色标记算法:在不同的GC中,代表不同的状态
白色:还未搜索(已经访问到,没有完成扩展,还在队列)
灰色:正在搜索(未被访问)
黑色:已经搜索完成(已经扩展完)
2.并发标记算法
漏标问题:灰色对象B对白色对象C的引用消失,A已经扩展完,C不再能被访问。
本质问题:黑色对象引用白色对象,白色对象没有其他路径引用到自己。
方法一:往前进:直接将未标记的白色对象标灰色;不会影响效率;产生浮动垃圾。
方法二:往后退:把黑色对象标灰色;Lua做法;目的减少浮动垃圾。
3.CMS
主要用于老年代对象回收,标记清除法;
初始标记(停顿)--并发标记--Remark重新标记(停顿)--并发清除
CMS参数调优
为了提高Write Barrier效率,使用card table方式进行标记;会产生浮动垃圾。
在做年轻代GC之前把card table中的内容转移到mod union table
4.基础参数
-Xmx 堆的最大size
-Xms 堆的初始size
-Xmn/NewSize 年轻代的size
SurvivorRatio 默认8 eden/survivor 分配空间
NewRatio 默认2 old/young 年轻代的大小