一、调优基本问题
1.1 为什么要调优
- 防止出现OOM(OutOfMemoryError,内存不足),进行JVM规划和预调优。
- 解决程序运行中各种OOM。
- 减少Full GC出现的频率,解决运行慢,卡顿问题。
1.2 调优的大方向
- 合理的编写代码
- 充分并合理的使用硬件资源
- 合理的进行JVM调优
1.3 不同阶段的考虑
- 上线前
- 项目运行阶段
- 线上出现OOM
1.4 注意点
无监控,不调优
调优,从业务场景开始,没有业务场景的调优都是耍流氓。
二、性能优化的步骤
2.1 熟悉业务场景
2.2 发现问题(性能监控)
- GC频繁
- CPU load过高
- OOM
- 内存泄漏
- 死锁
- 程序响应时间较长
2.3 排查问题:性能分析
- 打印GC日志,通过GCviewer或者http://gceasy.io来分析日志信息
- 灵活运用命令行工具jstack,jmap等。
- dump出堆文件,使用内存分析工具分析文件
- 使用阿里Arthas,VisualVM和jConsole来实时监控JVM状况。
- jstack查看堆栈信息
三、解决问题:性能调优
- 适当增加内存,根据业务场景选择垃圾回收器。
- 优化代码。控制内存使用
- 增加机器,分散节点压力。
- 合理设置线程池线程数量
- 使用中间件提高程序效率,比如缓存,消息队列等。
四、使用Apache JMeter进行性能测试
五、优化案例
5.1 调整堆大小提升服务的吞吐量
5.2 逃逸分析
堆,是分配对象的唯一选择吗?
5.2.1 编译的开销
时间开销
空间开销
5.2.2 即时编译对代码的优化
逃逸分析
示例
5.2.3 代码优化
代码优化一:栈上分配
代码优化二:同步省略(消除)
代码优化三:标量替换
测试
注意,必须启动逃逸分析,才能使用标量替换
5.2.4 逃逸分析总结
5.3 合理配置堆内存
推荐配置
如何计算老年代存活对象
方式一:查看日志
方式2:强制触发Full GC
如何计算GC的频率
5.4 新生代和老年代的比例
5.5 CPU占用很高排查方案
5.6 G1并发执行的线程数对性能的影响
5.7 调整垃圾回收器提升服务的吞吐量
5.8 日均百万订单如何设置JVM参数