一、背景
在项目调试过程中,突然遇到莫名奇妙的情况,一个测试过的正常流程,突然运行不正常了,项目重启后又能正常运行。异常流程使用了google的eventbus做异步处理。
二、分析
查看日志发现异步逻辑运行到一处远程调用处就没有后续日志了。之前遇到过httpClient的坑,所以问题点确定了。但是没确定为啥后续全部异步流程都不在处理了,于是开始排查线程。
查看运行的进程
jps -l
打印当前线程的堆栈信息
jstack -l 1082 >1082.stack
分析线程信息
可以使用这个网站在线分析https://gceasy.ycrash.cn/
线程分析结果
从线程分析结果可以看到问题在eventbus这块,根据提示查看源码。
查看eventbus的源码
可以看到此处加了锁,接着根据显示的内存地址找实际执行的代码。
下载dump
jmap -dump:format=b,file=wanfile.dump 1082
使用Memory Analyzer分析dump
三、总结
因为eventbus执行的时候加了锁,所以异步逻辑内如果有长时间占用线程的代码,就会出现后续异步逻辑无法执行只能阻塞。
例如:
httpClient没有设置超时时间,如果远程调用的服务出现问题就会出现一致占用的情况,然后后边的线程只能一直阻塞。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1003805540@qq.com