一、理论知识
常见参数:
- -Xms 堆初始化 例如:-Xms256m
- -Xmx 堆最大值 例如:-Xmx512m
- -Xmn 堆新生代 例如:-Xmn100m
- -XX:NewRatio 新生代与老年代的比例
- -XX:SurvivorRatio 新生代区域比例,默认8,代表Eden:From Survivor:To Survivor = 8:1:1
垃圾回收器:
- Serial/Serial Old 新生代/老年代,古老,单线程,暂停所有用户线程,复制算法/标记整理算法
- ParNew 1的多线程版本
- Parallel Scavenge 新生代,多线程,不需要暂停用户线程,复制算法
- Parallel Old 老年代,多线程,不需要暂停用户线程,标记整理算法
- CMS(Current Mark Sweep,详情)老年代,与ParNew配合使用,牺牲吞吐量获得最短停顿,标记整理算法
- G1 并行与并发收集器,可预测的停顿时间
二、实践案例
- Full GC 之前进行 Minor GC 避免扫描过多的对象, 配置:CMSScavengeBeforeRemark
- Xms和Xmx设置为相同,这样可以减少内存自动扩容和收缩带来的性能损失
- JVM调优是最后的稻草,进行JVM调优之前应该先优化架构和代码
- 调优是一个复杂的过程,根据具体的场景结合对垃圾回收器的深入理解进行调优,才可能事半功倍。
各个区大小比例建议
1 | # 活跃空间大小:Full GC后堆中老年代占用空间的大小 |
三、参考连接
1.1 https://www.cnblogs.com/honey01/p/9475726.html
1.2 https://www.cnblogs.com/dolphin0520/p/3783345.html
2.1 https://tech.meituan.com/2017/12/29/jvm-optimize.html