一开游戏cpu就满了 cpu使用率过高怎么办( 二 )


top使用方法:
使用格式:top[-][d][p][q][c][C][S][s][n]参数说明: d:指定每两次屏幕信息刷新之间的时间间隔 。当然用户可以使用s交互命令来改变之 。p:通过指定监控进程ID来仅仅监控某个进程的状态 。q:该选项将使top没有任何延迟的进行刷新 。如果调用程序有超级用户权限 , 那么top将以尽可能高的优先级运行 。S:指定累计模式 。s:使top命令在安全模式中运行 。这将去除交互命令所带来的潜在危险 。i:使top不显示任何闲置或者僵死进程 。c:显示整个命令行而不只是显示命令名 。
此时发现如果是Java的进程占用过高 , 并且一直下不来 , 则排查是什么线程导致占比过高 。以图中进程举例 , 假如发现PID为31357的Java进程占CPU比一直很高 , 则记录下它的PID
2.查看Java进程里面的线程的占用情况
top -H -p 31357 然后按shift+p按照CPU排序
说明:-H 指显示线程 , -p 是指定进程

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
可以看到CPU占用较高的线程 , 记下他们的PID , 假设这里31357的CPU占比一直是50%
或者是再用ps -mp pid -o THREAD,tid,time 查询进程中,那个线程的cpu占用率高 记住TID
一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
【一开游戏cpu就满了 cpu使用率过高怎么办】
将查找到的 线程占用最高的 tid 上图中 29108 转成16进制 --- 71b4

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
3.通过jstack命令获取占用资源异常的线程栈 , 可暂时保存到一个文件中查看
jstack 31357 jstack.31357.log

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
以上能看到指定线程的堆栈信息 。如果想看到关于线程中的锁的附加信息 , 可以加一个-l参数

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
4.上面方法用于进程正常情况下的堆栈打印
用jstack -l命令没有响应 , 估计是CPU一直站着不能执行正常的命令 , 根据提示[The -F option can be used when the target process is not responding]只能放大招了 。
jstack -F PID jstack.PID.txt
吐出的实际日志结果如下:

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
发现一大坨线程阻塞了 , 有用的结果在这里:

一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
显然一直在跑的是19576这个线程 , 一直在执行EXCEL导出的相关方法 , 问题就出在这里 , 下面的任务就是排查这个地方的代码逻辑了 。
jstack命令格式:
jstack [ option ] pid
参数说明:
-F jstack [-l] pid无法响应时 , 强制打印堆栈-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.-m 混合模式输出(包括java和本地c/c++片段)堆栈 。pid: java应用程序的进程号5jps命令查看java进程的pid更实用
一开游戏cpu就满了 cpu使用率过高怎么办

文章插图
命令格式
jps [ options ] [ hostid ]
参数说明:
-m 输出传递给main方法的参数 , 如果是内嵌的JVM则输出为null 。-l 输出应用程序主类的完整包名 , 或者是应用程序JAR文件的完整路径 。-v 输出传给JVM的参数 。
三个参数加在一起显示更详细的信息:

推荐阅读