在项目中经常会碰到CPU占用率过高的问题,那么碰到这类问题应当如何处理呢?下面提供一种处理思路:
首先top -H -p <pid>以线程的模式查看java应用的运行情况,找到占用cpu或者内存大的线程,记录线程id,然后printf %x <tid>转为16进制,再jstack -l <pid> > thread.log把java进程的thread dump出来,从里面找到tid,分析是哪个线程占用了系统资源。具体操作步骤如下:
1、定位Java进程PID
通过Linux的top命令查看高cpu占用的java的进程PID
2、定位cpu占用高的java线程
# 以线程的模式查看Java应用的运行情况,找到占用cpu大的线程,记录线程id。
top -H -p <pid>
3、转换线程id为16进制
# 通过Linux的命令,获取tid的16进制表示。
printf "%x\n" <tid>
4、通过jstack查看问题线程的状态:
jstack <pid> |grep <tid的16进制> -A 100ck <pid> |grep <tid的16进制> -A 100
注意:这个命令的最后的-A 100,如果不加这个,那么只能看到该问题线程是哪个,其堆栈的stack信息看不到,这个100你可以理解为显示多少行,你可以设置为30,40等等,不过其实也用不了那么多的。
如果你的java应用时tomcat用户启动,然而你现在还是用root用户登录,则使用如下命令执行jstack
sudo -u tomcat /usr/local/java/bin/jstack <pid> | grep <tid的16禁止> -A 100
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




