由于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 |
垃圾回收器搭配
垃圾回收器的调优步骤
监视分析GC日志
- 开启JVM日志:
-XX:+PrintGCDetails
,也可以输出到指定文件
- 开启JVM日志:
分析结果,判断是否需要优化
- 查看日志,分析minorGC和FullGC的次数,如果频繁的发生minor和fullGC,就需要调整堆内存的大小
调整垃圾回收器类型,内存的分配
- 新生代和老年代比例默认为1比2
-Xms
:堆的起始内存,-Xmx
:堆的最大内存,-Xmn
:新生代大小。- 一般只设置起始内存即可,设置新生代大小目的是尽可能让GC发生在新生代中,不在老年代发生GC,减少系统的卡顿,如果需要设置新生代大小,最好新生代和老年代比例越高越好,否则默认比例即可
全面应用参数
- 全面应用在集群机器中
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。