看了几天也该做点总结了,这里简单的总结一下GC中的垃圾收集器.
1. Serial收集器:
首先它是最老的,单线程,作用在新生代的垃圾收集器,使用的算法是 标记-清除-复制算法进行回收垃圾的.同时也是jdk的Client模式下的默认新生代垃圾收集器,他的优势是单核CPU是个合适的选择.
2. ParNew收集器:
相当于Serial的多线程版本,同样也是作用在新生代的,使用的算法也是标记-复制算法,不同的是 他是虚拟机运行在Server模式下的默认垃圾回收器,同时也只有他与Serial能与老年代垃圾收集器CMS进行配合使用,优势是CPU核越多越好.
3. Parallel Scavenge收集器
新生代垃圾收集器,多个垃圾回收线程并行(其余业务线程还是会被挂起),使用标记-复制算法回收垃圾,但是他确实唯一一个关注与吞吐量(GCTimeRatio)的垃圾收集器(吞吐量的意思就是:运行用户代码时间/(垃圾回收时间+用户运行代码的时间)),他的优点是 可以自动调节新生代Eden与Survivor的比例.自适应调节 是他与ParNew最大的一个区别,但是他无法与CMS进行配合.
4 .Serial Old
Serial 老年代版本,其余的都一样.(CMS的替补队员),算法为标记整理算法
5. Paraller Old
Paraller Scavenge老年代版本,不同的是 使用标记整理算法,他与Paarller Scavenge配合使用.
6 .CMS垃圾收集器
历史最牛逼(暂时),对线程并发(多个垃圾收集器线程并行,业务线程同时不挂机),基于标记清楚算法,但是不同于标记清楚算法.他分为四个阶段去清理内存:
并行标记(其余线程Stop the World,找到GC ROOTS)
并发标记(其余线程正常走,GC针对于第一步找到的GC ROOTS进行可达性算法)
重新标记(查漏,因为上一步起于线程还在走)
并发清除
虽然CMS大大减少Stop the World 的时间,但是他也有明显的缺点
1. 占用CPU资源 2.并发程序会随时产生浮动垃圾,必须预留出一部分老年代的空间.3. 因为是标记清楚 算法,所以会产生大量的空间碎片,不过CMS有参数还可以控制,开启之后会在Full GC的时候进行内存整理 ,但是整理是需要Stop the World的 所以时间上可能会多.
7.G1垃圾回收器
最新,跨时代的垃圾回收器.
1. G1将垃圾回收器分为多个Region区域进行管理,但是保留分代思想,只不过物理上可能并不相连,
2. G1给每个Region评分,排名靠前会被优先收集,收集采用标记-整理算法.
3. 如果一个Region与另外一个Region相连,互相有引用,会吧引用信息存在Rememberd Set 中(每人一个)避免全堆扫描
对于G1不说太多,毕竟因为暂时还没有选择他的太好的理由,CMS仍然是第一选择,不过以后G1将会是第一选择.
写到这里,转载请标明出处!
网友评论