垃圾回收器搭配和调优

由于Java11中 ZGC的出现,尽量不要对GC调优的研究下太多功夫,对未来来说,这是贬值的。

新生代的垃圾回收器

收集器 算法 收集器类型 说明 适用场景
Serial 复制算法 单线程 进行垃圾回收时,须暂停所有工作线程,知道回收完成 简单高效,适合内存不大的情况
ParNew 复制算法 多线程并行 它是Serial收集器的多线程版本 搭配CMS的首选
Parallel Scavenge(吞吐量优先收集器) 复制算法 多线程并行 类似ParNew,更加关注吞吐量 主要适合后台运算不需要太多交互的任务

老年代的垃圾回收器

收集器 算法 收集器类型 说明 适用场景
Serial Old 标记整理 单线程 JDK7/8默认的 Client模式下虚拟机适用
Parallel Old 标记整理 多线程并行 Parallel Scavenge的老年代版本 在注重吞吐量场景下使用
CMS 标记清除 并行、并发 尽可能缩短GC时用户线程停止的时间,缺点:1、容易有内存碎片 2、需要更多的cpu资源 3、产生浮动垃圾,需要更大的堆空间 重视服务的相应速度
G1 跨代、标记整理 并行、并发 JDK7正式引入,采用分区回收的思维,基本不牺牲吞吐量的前提下,低停顿内存回收,可预测的停顿是其最大的优势 面向服务端应用的垃圾回收器,目标是取代CMS

垃圾回收器搭配

垃圾回收器的调优步骤

  1. 监视分析GC日志

    • 开启JVM日志:-XX:+PrintGCDetails,也可以输出到指定文件
  2. 分析结果,判断是否需要优化

    • 查看日志,分析minorGC和FullGC的次数,如果频繁的发生minor和fullGC,就需要调整堆内存的大小
  3. 调整垃圾回收器类型,内存的分配

    • 新生代和老年代比例默认为1比2
    • -Xms:堆的起始内存,-Xmx:堆的最大内存,-Xmn:新生代大小。
    • 一般只设置起始内存即可,设置新生代大小目的是尽可能让GC发生在新生代中,不在老年代发生GC,减少系统的卡顿,如果需要设置新生代大小,最好新生代和老年代比例越高越好,否则默认比例即可
  4. 全面应用参数

    • 全面应用在集群机器中

你可能感兴趣的:(java)