1. 背景
有时,线上集群load会突然飙升,无法响应正常请求。
那么引起load飙升的线程究竟在做什么?哪些线程霸占了CPU?可以通过top和jstack命令进行定位。
2. 定位步骤
1. 使用终端1进入目标机器,执行top命令,默认是进程视图,其中PID是进程号,截图如下:
在这里,我们只能看到java进程占用CPU达到115%,那么究竟是那些线程非常耗CPU呢?
2. 由于我们要看到线程,在终端1,按下“H”键或者“shift+h”,top视图会切换到线程视图,其中PID是线程号,截图如下:
可以发现红框内的线程的CPU使用率非常高,占用CPU时间达到1秒左右,显然不正常,但是这些线程在做什么?
3.
- 打开终端2,使用jstack命令输出这一时刻的线程栈,保存到文件,命名为jstack.log。注意:输出线程栈和保存top命令快照尽量同时进行。
- 4. 由于jstack.log文件记录的线程ID是16进制,需要将top命令展示的线程号转换为16进制,以15100为例,在linux下输入命令:printf 0x%x 15100,得到15100的十六进制为0x3afc
- 5. 在jstack.log中搜索0x3afc关键字,可以清晰看到该线程在做刷新地址列表,如下图:
3. 总结
以前碰到集群load飙升时,有时会束手无策,不知从何查起。以后再发生类似问题时,可以使用这个方法,看下究竟是那些线程在长时间占用CPU,尽快定位问题和解决问题。
相关推荐
通过 top 和 jstack 确定哪些线程耗尽了 CPU.docx
主要介绍了Java线程Dump分析工具jstack解析及使用场景,具有一定借鉴价值,需要的朋友可以参考下
通过ps到java进程号将进程的jstack信息输出。jstack信息是java进程的线程堆栈信息,通过该信息可以分析java的线程阻塞等问题。
主要介绍了如何通过jstack命令dump线程信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了JVM---jstack分析Java线程CPU占用,线程死锁的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
使用jstack定位分析CPU消耗问题
用jstack分析CPU占用率高的原因 1 top -H -p pid 2 linux printf命令将10进制转换为16进制 3在jstack中找到相应的堆栈信息jstack pid grep 'nid' -C5 –color
error01.txt 这个可以自己取名字 多输出几份jstack 文件,做比对分析 windows 输出环境变量 echo %JAVA_HOME% ps H -eo user,pid,ppid,tid,time,%cpu,cmd --sort=%cpu backgroundProcessorDelay=900 PsExec.exe ...
JStack和Java Thread Dumps分析
主要介绍了jstack和线程dump实例解析,具有一定借鉴价值,需要的朋友可以参考下
临界区的设置是为了保证其内部的代码执行的原子性和完整性,但因为临界区在任何时间只允许线程串行通过,这和我们使用多线程的初衷是相反的。如果在多线程程序中大量使用synchronized,或者不适当的使用它,会造成...
通过jps 和jstack定时收集java进程的线程信息
分析java线程日志的工具,使用jstack把java线程日志dump下来,然后上传到该工具,就可以查看线程阻塞情况等信息。
windows系统jstack自动抓取脚本
MPP的jstack分析结果
图形界面分析threadump_jstack分析工具_包含jdk。IBM出品,用来分析jstack pid 打印的信息。用着挺方便的。
Broken pipe产生的原因通常是当管道读端没有在读,而管道的写端继续有线程在写,就会造成管道中断。(由于管道是单向通信的) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
WEB Server确认: 服务CPU高并不一定一定是Server导致,也可能是其他辅助服务,需要根据top命令确认 单线程问题定位: 根据进程PID列线程列表top -Hp PID; jstack 打印占用资源较多线程代码位置 多线程问题...
自动抓取jstack
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。 一、首先获得jvm的进程...