屎山JAVA系统性能问题排查

结论

  1. 通过Arthas工具trace命令监控到耗时长的方法,特定方法分析性能并优化;
  2. 通过jstack分析blocked线程;

优化方向

  1. 优化复杂的不合理的SQL
    • 循环列表执行SQL -> 一次执行SQL查询列表所需内容,遍历结果处理业务逻辑;
    • 较稳定的数据表每次使用都查询 -> 使用jvm缓存,缓存更新按不同数据场景分两种
      1. 数据更新时刷新缓存
      2. 定时缓存失效,下次使用查库并加载到缓存
  2. blocked线程锁等待
    • 公共数据类,使用ConcurrentHashMap、ConcurrentHashSet等支持高并发的数据集合类型
    • 公共方法类,syncronized function 降低锁的范围,方法关键字syncronized降级为方法体内 syncronized(entity){};entity可以是一个不能并发的一个颗粒度对象,比如 产品修改并发时,syncronized(产品缓存实体),这样不同产品就允许并发执行,同一产品修改时会锁同一个产品缓存实体,避免并发修改导致的问题。

排查过程工具

Arthas

  1. 常用命令,具体命令作用见官方文档,这里只按常用调整下参数
  • 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'
  1. 快捷使用
  • IDEA arthas插件快速生成命令


    image.png

jstack

  1. 基础工具使用,具体看blocked线程waiting的对象id waiting to lock <0x00000003c03e49a0>
  2. 再查看这个对象id的持有线程 locked <0x00000003c03e49a0>
  3. 分析锁的是什么,按锁的等级层次加业务逻辑分析,按上边说的常用优化方向处理。还搞不懂就请教大神吧

jstack工具:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容