JAVA线上常见问题排查

2022-01-21  本文已影响0人  运气爆棚lsw

1.线上CPU飙高排查思路

一般常见的原因主要是:
①死循环(while / 递归 / for循环相关等 )

②锁相关引发( CAS自旋锁过多 / 线程死锁 / 数据库死锁引发程序 )

③线程阻塞 / 网络IO (远程调用阻塞线程不能释放 / 持续任务超时等待 )
/或者数据库连接并发数资源耗尽

④JAVA程序频繁FULL GC(大量对象被引用,无法及时进行垃圾回收等)
/ 未合理分配新生代和老年代的比例导致
/ 或者服务器CPU/内存等资源无法支撑线上程序运行
/ 频繁创建超大类型对象或者上传文件过大过多导致内存耗尽

1.先使用TOP命令查看占用CPU比较高的进程,执行top命令,查看所有进程占系统CPU的排序
2.然后用 top -H -p pid 来找到cpu使用率比较高的线程
3.控制台执行 printf '0x%x' tid 线程 id 二进制转化 成16 进制
4.使用 jstack pid | grep tid 找到线程堆栈 (tid为步骤3得到的结果)

2.阿里巴巴开源诊断工具 arthas

# 执行以下命令,下载arthas运行jar包

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar 

# 如果Linux未配置Java环境变量 可以使用使用 whereis java查找bin路径,指定路径执行
# 例如: /usr/bin/java -jar arthas-boot.jar
启动成功如图:

3.使用开源工具 show-busy-java-threads (需要下载)

# 主要功能:
show-busy-java-threads
1.从所有运行的Java进程中找出(5个缺省)最消耗CPU的线程,打印线程栈信息
2.缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便
3.手动指定分析的Java进程Id,以保证只会显示单个Java进程的信息
show-busy-java-threads -p <指定的Java进程Id>
show-busy-java-threads -c <要显示的线程栈数>

具体使用参考一下执行语句,逐条执行即可

命令获取:
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads
下载完毕之后赋予执行权限
chmod +x show-busy-java-threads
开始执行
./show-busy-java-threads
执行下载

运行结果如图:
上一篇下一篇

猜你喜欢

热点阅读