垃圾收集算法
- 分代收集理论 针对新生代和老年代中存活对象数量不同,新生代中朝生夕死采用复制算法,老年代存活对象较多,采用标记清除和标记整理算法
- 复制算法 将内存分类大小相等的两块,每次只使用其中一块,当一块内存使用完时,将存活的对象复制到另一块,清理掉这一块
- 标记清除算法 将存活的对象进行标记,没有存活的对象进行清理,缺点:效率问题以及碎片化
- 标记整理算法 将存活的对象进行标记,向一端移动,统一回收另一端内存
垃圾收集器
收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现
并没有一种垃圾收集器能解决所有问题,只能根据项目实际需要,选择适合的垃圾收集器。
1. Serial收集器 (-XX:+UseSerialGC -XX:+UseSerialOldGC)
串行收集器,单线程,会STW。新生代采用复制算法,老年代采用标记整理算法
特点:简单而高效(与其他单线程收集器相比)
Serial Old收集器是Serial收集器的老年代版本
2. Parallel Scavenge收集器(-XX:+ParallelGC -XX:+UseParallelOldGC)
并行收集器,其实就是Serial收集器的多线程版本,Parallel Scavenge 关注点是吞吐量,CMS等垃圾收集器的关注点更多的是用户的体验,卡顿的时间。
新生代采用复制算法,老年代采用标记整理算法
3. ParNew收集器(-XX:+UseParNewGC)
ParNew收集器与Parallel 收集器类似,主要区别在于ParNew 可与CMS收集器配合使用
新生代采用复制算法,老年代采用标记整理算法
4. CMS收集器(-XX:+UseConcMarkSweepGC(old))
CMS收集器是一种以获取最短回收卡顿时间为目标的收集器,它非常符合在用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集器和用户线程(基本上)同时工作。 采用标记清除算法实现
分为4个步骤: 初始标记
并发标记
重新标记
并发重置
优点:并发收集,低卡顿
缺点:对cpu资源敏感 无法处理浮动垃圾
底层采用标记清除算法,碎片化,当然可以通过参数配置,进行整理
垃圾收集器底层算法实现
三色标记 黑色 灰色 白色
5. G1 收集器
G1收集器取代了并行收集器(年轻代+老年代组合),不再区分是哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。