一般在开发Java的时候,为防止占用过多的资源,对CPU和内存的占用,都会有一个要求,例如CPU不能超过70%,内存不能超过4G等,那在一般问题定位的过程中,如何和定位这些问题呢,下面简单介绍一下CPU占用过高问题的定位方法。
Linux环境
在Linux上面,可以借助丰富的命令行工具来进行定位
- 查找占用过高的进程
执行top
命令查看CPU占用高的进程
例如我们认为上面红框的部分为显示的CPU占用过多的进程,可以看到,其进程号为93937,下面会多次使用这个进程号定文。
- 查找对应的线程
执行ps -mp 93937-o THREAD,tid,time
如下
最下面的三个线程,显示占用较高,几乎占满的单个CPU的时间
- 查找对应的方法栈
这边利用了Java自带的jstack
命令,执行一下jstack 93937
,如下
如上,我们看到这几个线程,当然真实场景会更为复杂一些,红框的部分,是线程号,我们看到这些都是以0x
打头的,是16进制的表示,所以需要将步骤二定位出来的线程号转换一下,可以直接在Linux命令行输入如下命令来定位上面框出来的三个线程
printf "%x\n" 93975
16f17
printf "%x\n" 93976
16f18
printf "%x\n" 93977
16f19
正好定位到三个16进制表示的线程号,至此就找到了对应的方法栈,下面就可以直接去代码里面查找问题了。
当然,对于此步骤,还可以一步执行如下命令定位,如下
jstack 93937 | grep $(printf "%x\n" 93975) -A 10
93937 表示进程号, 93975 表示有问题的线程号
-A 10
表示多打印10行,这个可以根据不同情况设置
Windows环境
推荐使用JDK自带的工具Java Visual VM,一般就是这货,在JDK的bin目录下
点开之后
左侧会显示现在正在运行的Java进程,我们随便点开一个
可以看到此进程的一些运行信息,下面关注我们的问题,直接查看CPU的使用情况
可以清晰的看到CPU时间占用最多的线程,现在就还是利用
jstack
来定位具体是哪个方法jstack.exe -l 6964 >dump.stack
然后就在输出文件中查找对应线程名即可。
上面就是一些对CPU占用问题的简单介绍,感谢阅读!