GC参数

Java垃圾回收器

串行垃圾回收器:单线程 “牵一发动全身” (默认的Serial收集器)
1.对古老,最稳定的
2.效率高
3.可能会产生比较长的停顿
4.使用方法 -XX:+UseSerialGC(新生代使用复制算法、老年代标记-整理)

并行垃圾回收器:多线程
ParNew 收集器(新生代收集器)
1.使用 -XX:+UseParNewGC (新生代并行、老年代串行)
2.多线程需要有多核支持
3.-XX:ParallelGCThreads 限制线程数量
4.新生代会使用复制算法

Parallel收集器
1.类似ParNew,新生代使用复制算法,老年代使用标记-整理算法
2.更加关注增加吞吐量
3. -XX:+UseParallelGC 使用Parallel收集器,老年代串行
-XX:+UseParallelOldGC 使用Parallel收集器,老年代并行

并发标记扫描垃圾回收器 CMS:利用多线程对需要回收的对象进行标记并回收。
1.-XX:+UseConcMarkSweepGC
2.使用标记-清除算法(会产生碎片)
3.并发阶段会降低吞吐量
4.老年代收集器(新生代使用ParNew)
5. -XX:CMSInitiatingOccupancyFraction设置GC的阀值
6.更加关注降低停顿
7:-XX:+UseCMSCompactAtFullCollection 设置在一次Full GC后,进行一次整理
特点:

  • 尽可能降低停顿,即降低延迟
  • 会影响系统整体吞吐和性能
  • 清除不彻底
  • 因为和用户线程一起运行,不能在空间快满时再清理

G1垃圾回收器:对比较大的进行回收,可以先压缩再回收。

关于回收器的补充:
串行回收器和并行回收器在进行垃圾收集时,用户线程会暂停;而CMS用户线程和垃圾回收线程是并行的,所以垃圾可能会清除不彻底。

总结:

  • 性能的根本在于应用,要根据业务需求选择合适的GC策略
  • GC参数属于微调
  • 设置不合理,会影响性能,产生大的延时