垃圾收集器的理论依据是垃圾回收算法,这里是指堆内存的垃圾收集器。
垃圾收集器的两大指标:
GC时间:GC时会暂停其他工作线程(Stop the World),越短越好。
吞吐量: 用户代码时间为x,垃圾收回时间为y,那么吞吐量为 x / ( x + y )
一、新生代垃圾收集器
1、串行收集器
复制算法,单线程,独占式。
2、并行收集器
复制算法,多线程,独占式。
3、Parallel Scavenge收集器
复制算法,多线程,独占式,以吞吐量优先。
二、老年代收集器
1、串行收集器(串行收集器的老年代版本)
MC算法,单线程,独占式。
2、并行收集器(串行收集器的多线程版本)
MC算法,多线程,独占式。
3、CMS(Concurrent Mark Sweep)
MS算法,多线程,追求GC时间最短。
其步骤如下(将Mark拆分为三个阶段):
1)初始标记(停顿):仅仅标记GC Root能标记到的对象。
2)并发标记(并发):GC Roots Tracing的过程。
3)重新标记(停顿):标记并发标记时的产生的垃圾。
4)并发清除(并发):可能产生浮动垃圾。
其中1,3两个步骤仍会Stop the World,但时间很短。缺点如下:
1)并发程序对CPU敏感,收集器的线程数量需要调试。
2)无法处理浮动垃圾。
3)会带来内存碎片问题。一个优化手段是,设置虚拟机参数,在进行N次GC之后,来一次带压缩整理的回收。
三、实战
我经历的两个项目所使用的收集器都是: 并发收集器 + CMS收集器。
遇到的OutOfMemoryError分为以下几种情况
1)堆空间太小
2)方法区太小(规则文件中的规则太多)
3)OS对内存数量限制过小。导致OutOfMemoryError:unable to create new native thread,如下图所示:
可以通过ulimit -a 设置线程数量。
2017-12-29阅:
一个系统或者工具,我们必须思考两个核心问题:技术指标是什么?优点和缺点是什么?这就好比箭靶,所有的努力都是为了命中靶心。
细节可以忘记,但思维不能丢失。以这种思维来看,CMS垃圾收集器的两大技术指标是:GC时间短和吞吐量大。优点和缺点也很明显。
值得一提的是,CMS可谓是并发版本的MS算法,设计精华是将M分解成了3个阶段,尽可能地减小了GC时间。看看,分而治之算法可谓无处不在。