3
由于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

垃圾回收器搭配

image-20200803224511274

垃圾回收器的调优步骤

  1. 监视分析GC日志

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

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

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

    • 全面应用在集群机器中

在谷歌上百度
69 声望199 粉丝