1:通过top命令查询占用CPU过大的进程,假设找到的占用CPU最大的线程的PID为 1000

命令:top

2:查询项目

命令1>列出所有的java项目以及占用的PID进程号        jps -l

命令2>ps -ef | grep 【进程ID(通过top命令找到的占用进程高的PID)】

3:把栈堆信息打印或生成文件

打印栈堆信息>        jstack 【进程ID(通过top命令找到的占用进程高的PID)】

导出栈堆信息>        jstack 【进程ID(通过top命令找到的占用进程高的PID)】 > 【文件名称】

1001 和 1002

命令> top -Hp 【线程PID(如上top找到的1000)】

5:把4中找到的线程的PID分别转换成16进制(如上的1001 和 1002 转换后分别为 3e9 和 3ea)然后去3中打印或者生成的文件中搜索 ,可以通过命令转换

命令> printf '%x' 【要转换的内容】

 6:通过以上搜索就可以知道哪个线程在执行哪些方法导致CPU占用过高了(查看执行的方法找到对应的代码检查)

7:当显示为GC导致的(如下图)则需要进一步判断哪些原因导致疯狂的GC,一般情况下为一些对象占用(通常要考虑的是线程)

Java服务器要求CPU 服务器java命令cpu占用过高_Java服务器要求CPU

 8:我们可以通过计算每次GC使用的情况,这个时候可以通过jstat命令统计

命令> jstat -gc 【进程的ID】 【每次统计时间的毫秒值大小】 【统计次数】

 计算方式为:(下一个FGC - 上一个FGC)=这段时间内的GC数

                        (下一个FGCT - 上一个FGCT)=这段时间内的GC耗时

通过以上的方式可以确定是否是GC耗时占用过多的CPU了

9:接下来就是找出问题,可以通过jmap命令打印出这个进程里面对象的占用的空间情况

全部占用情况查找命令> jmap -histo 【进程的PID(步骤一中找到的)】

部分占用情况查找命令> jsmp -histo 【进程的PID(步骤一中找到的)】 | head -【显示的前几个的数量】

 通过以上的方式就可以基本确定大部分的CPU内存占用过高的情况了