文章目录
常见的垃圾回收器(下)
Serial垃圾回收器 + SerialOld垃圾回收器
Serial是一种单线程串行回收年轻代的垃圾回收器
 
 回收年代和算法
 年轻代:复制算法
 老年代:标记-整理算法
 优点
 单CPU处理器下吞吐量非常出色
 缺点
 多CPU下吞吐量不如其他垃圾回收器,堆如果偏大会让用户线程处于长时间的等待
 适用场景
 Java编写的客户端程序或者硬件配置有限的场景
PS + PO
PS+PO是JDK8默认的垃圾回收器,多线程并行回收,关注的是系统的吞吐量。具备自动调整堆内存大小的特点。
 
 回收年代和算法
 年轻代:复制算法
 老年代:标记-整理算法
 优点:
 吞吐量高,而且手动可控。为了提高吞吐量,虚拟机会动态调整堆的参数
 缺点:
 不能保证单次的停顿时间
 适用场景:
 后台任务,不需要与用户交互,并且容易产生大量的对象
 比如:大数据的处理,大文件导出
ParNew
ParNew垃圾回收器本质上是对Serial在多CPU下的优化,使用多线程进行垃圾回收
 -XX:+UseParNewGC 新生代使用ParNew回收器,老年代使用串行回收器
 
回收年代和算法
 年轻代
 复制算法
 优点q
 多CPU处理器下停顿时间较短
 缺点
 吞吐量和停顿时间不如G1,所以在JDK9之后不建议使用
CMS
CMS垃圾回收器关注的是系统的暂停时间,允许用户线程和垃圾回收线程在某些步骤中同时执行,减少了用户线程的等待时间。
 参数:-XX:+UseConcMarkSweepGC
 
回收年代和算法
 老年代
 清除算法
 优点
 系统由于垃圾回收出现的停顿时间较短,用户体验好
 缺点
 1、内存碎片问题
 2、退化问题
 3、浮动垃圾问题
 适用场景
 大型的互联网系统中用户请求数据量大、频率高的场景
 比如订单接口、商品接口等
 CMS垃圾回收器存在的问题
 1、CMS使用了标记-清除算法,在垃圾收集结束之后会出现大量的内存碎片,CMS会在Full GC时进行碎片的整理。这样会导致用户线程暂停,可以使用-XX:CMSFullGCsBeforeCompaction=N 参数(默认0)调整N次Full GC之后再整理。
 2.、无法处理在并发清理过程中产生的“浮动垃圾”,不能做到完全的垃圾回收。
 3、如果老年代内存不足无法分配对象,CMS就会退化成Serial Old单线程回收老年代。
 4、并发阶段会影响用户线程执行的性能










