结论
- 通过Arthas工具trace命令监控到耗时长的方法,特定方法分析性能并优化;
- 通过jstack分析blocked线程;
优化方向
- 优化复杂的不合理的SQL
- 循环列表执行SQL -> 一次执行SQL查询列表所需内容,遍历结果处理业务逻辑;
- 较稳定的数据表每次使用都查询 -> 使用jvm缓存,缓存更新按不同数据场景分两种
- 数据更新时刷新缓存
- 定时缓存失效,下次使用查库并加载到缓存
- blocked线程锁等待
- 公共数据类,使用ConcurrentHashMap、ConcurrentHashSet等支持高并发的数据集合类型
- 公共方法类,syncronized function 降低锁的范围,方法关键字syncronized降级为方法体内 syncronized(entity){};entity可以是一个不能并发的一个颗粒度对象,比如 产品修改并发时,syncronized(产品缓存实体),这样不同产品就允许并发执行,同一产品修改时会锁同一个产品缓存实体,避免并发修改导致的问题。
排查过程工具
Arthas
- 常用命令,具体命令作用见官方文档,这里只按常用调整下参数
- trace 查找最耗时的方法
trace top.weeki.DemoArthas traceFunction -n 50 --skipJDKMethod false '#cost>10000' >> trace.log &
-n 50 是监测50次, #cost>10000只打印耗时大于10秒的记录 - watch 查看方法入参及返回,用于定位数据异常
watch top.weeki.DemoArthas traceFunction '{params,returnObj,throwExp}' -n 5 -x 4 -b
-x 4 是打印出入参层级,-b是调用时打印,想看返回结果把-b换成-s -
>> trace.log &
后台执行,并输入到 trace.log文件,各种命令都可以加,自己区分好文件名就行,这里不知道输出到哪的可以填绝对路径 - 一次监测多个类的多个方法
trace -E top.weeki.DemoArthas|top.weeki.DemoArthas2 traceFunction| traceFunction2 -n 50000 --skipJDKMethod false '#cost>10000'
- 快捷使用
-
IDEA arthas插件快速生成命令
jstack
- 基础工具使用,具体看blocked线程waiting的对象id
waiting to lock <0x00000003c03e49a0>
- 再查看这个对象id的持有线程
locked <0x00000003c03e49a0>
- 分析锁的是什么,按锁的等级层次加业务逻辑分析,按上边说的常用优化方向处理。还搞不懂就请教大神吧
jstack工具:
- jdk1.8/bin/jstack
- jstack日志分析网站http://poi.apache.org/slideshow/xslf-cookbook.html