性能优化心得
这是篇总纲性的性能优化心得,并不涉及具体的算法调优与业务场景
傻瓜式优化
我把程序优化的初级阶段称为傻瓜式优化。傻瓜式的好处在于简单、明了、见效快。缺点就是这样的优化存在优化瓶颈,可能无法达到我们预期的性能指标。在程序性能调优过程中最常见的就是这种傻瓜式的优化。
傻瓜一式
当项目上出现性能问题,如果是针对特定操作的性能问题,那可以通过jstack pid
来看线程dump,从线程dump中大概率可以看到比较明显的问题。然后我们进行针对性的调优即可。比如,for循环中查询数据库。在傻瓜一式中有很多工具都可以给我们提供帮助,我经常使用的是这三个工具:jstack、yourkit、arthas
傻瓜二式
-
如果项目上线后,任何操作都比较慢,可以先通过
jstat -gccause pid 2000
来观察一下gc。当确定gc存在一定的问题时,我们可以通过jcmd pid JFR.start name=test duration=60s settings=profile filename=output.jfr
来创建飞行记录。通过飞行记录找到对应的优化点。飞行记录功能需要手动开启:
- 在启动命令中添加
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
可以开启飞行记录功能。 - 也可以通过
jcmd pid VM.unlock_commercial_features
来在线开启飞行记录功能
- 在启动命令中添加
-
如果系统存在严重的gc问题,频繁fullgc,并且jvm已经失去响应。那可以在重启服务时添加启动参数
-XX:+HeapDumpAfterFullGC
或者通过jinfo -flag +HeapDumpAfterFullGC pid
线上开启。这个参数的效果是每次fullgc之后,系统会自动生成一个堆dump,我们可以通过堆dump来分析内存问题。用完后一定要关闭这个参数。
深入优化
某些核心逻辑可能仅仅是傻瓜式的优化无法达到我们预期的性能指标,这时就需要进行深入优化了。执行深入优化的开发人员必须满足以下要求:
- 完全了解待优化代码的业务逻辑
- 具备一定的性能优化经验
- 有自己独立思考的意识,能从不同的角度观察和解决问题
深入优化一般会伴随代码的重构,所以当优化完毕后,需要进行完善的测试才能上线。
分享一下最近做的一次性能调优
最近的一次性能调优中,有3500多条参数需要处理,之前的逻辑跑完需要60秒,采用傻瓜式优化方式优化到了15秒,但是还是太慢了。采用深入优化,从根本上寻求解决问题的方式,最后只需要1.6秒就可以将3500多条参数全部处理完毕。