分享下我一年中遇到的线上程序假死问题,都是如何排查的
一下分析过程,假设你脱离了apm工具,或者像阿里巴巴提供的工具
其实分析过程挺简单的,基本都是因为线程watting
1、一般先看程序日志是否正常,如果日志没有任何打印
2、curl "127.0.0.1:port"看看服务是否可以正常访问,再ss -s看看连接数什么的
如果无法访问
3、接着用 top 或者 jps -v 或者 ps -ef | grep java查看服务进程id (pid)
4、jstack pid >> demo.log
5、直接看log,或者使用如https://jstack.review/#tda_1_dump 等网关分析一下线程信息
6、如果是线程堵死导致的,一般会看到很多线程watting着一个线程,一般被watting的线程也会有代码提示,一般也就定位到问题了
=======================执行到这里==========================
达到前6步,
解决过http工具没设置超时,被第三方堵死的问题
数据库连接池时间太长,数据库出问题,被堵死的问题
数据库事务忘记提交,导致连接堵死的问题
redis 旧jedis版本问题,导致连接堵死问题
=========================================================
7、如果看到线程堵着,又没发现问题,那这个时候就需要分析是什么线程,比如是gc线程,那么就需要用如 jstat
执行 jstat -gcutil pid (intervl) (count),看看fgc、Eden、Old区的情况
8、假如真的是gc线程堵死(stw),那这个时候要jmap dump下堆文件,使用mat分析,看是否存在内存泄漏。同时需要注意虚拟机的资源分配是否合理
===================执行到这里================================
达到前8步
解决过excel导出,内存不足导致的fullgc问题
解决过springgmvc redirect链接变化导致的内存泄漏,fullgc无法回收,gc limited问题
刚刚发现orikafactory使用不当导致的内存泄漏,Eden、Old区全满,导致的服务假死问题
以上常用的jstack、jmap、jstat、jps其实已经能解决遇到的大部分问题,如果无法解决与定位,建议得采用更专业的工具了