线程阻塞排查

  1. 一、背景
  2. 二、分析
  3. 三、总结

一、背景

在项目调试过程中,突然遇到莫名奇妙的情况,一个测试过的正常流程,突然运行不正常了,项目重启后又能正常运行。异常流程使用了google的eventbus做异步处理。

二、分析

查看日志发现异步逻辑运行到一处远程调用处就没有后续日志了。之前遇到过httpClient的坑,所以问题点确定了。但是没确定为啥后续全部异步流程都不在处理了,于是开始排查线程。

  1. 查看运行的进程

     jps -l
    
  2. 打印当前线程的堆栈信息

    jstack -l 1082 >1082.stack
    
  3. 分析线程信息

    可以使用这个网站在线分析https://gceasy.ycrash.cn/

  4. 线程分析结果

    线程分析结果

    从线程分析结果可以看到问题在eventbus这块,根据提示查看源码。

  5. 查看eventbus的源码

    eventbus源码问题点

    可以看到此处加了锁,接着根据显示的内存地址找实际执行的代码。

  6. 下载dump

    jmap -dump:format=b,file=wanfile.dump 1082
    
  7. 使用Memory Analyzer分析dump

dump分析结果

三、总结

因为eventbus执行的时候加了锁,所以异步逻辑内如果有长时间占用线程的代码,就会出现后续异步逻辑无法执行只能阻塞。

例如:

​ httpClient没有设置超时时间,如果远程调用的服务出现问题就会出现一致占用的情况,然后后边的线程只能一直阻塞。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1003805540@qq.com

×

喜欢就点赞,疼爱就打赏