最近,Linux服务器上总是经常会出现几个CPU利用率达到100%并且一直高居不下,如下图所示,再Linux上,输入 top 命令,然后再按一下 1,就会显示你服务器逻辑CPU的数量以及现在服务器CPU各个参数,这些参数的详细信息我这里就不再多讲了,从下面的图中可以看出,有四个CPU的使用率达到了100%,很明显的,程序有问题
明显的,从 top 命令很轻易的可以看出,占据CPU不放的是Java进程,该进程的PID是19825
命令查看这个进程下面的所有线程占用情况ps mp pid -o THREAD,tid ,也可以通过 top -H -p pid 找到导致cpu高的线程
这两个命令查找的结果是一样的,都找到了这四个导致CPU居高不下的PID,1482,27308,28575,和4466而后,使用JVM自带的jstack命令导出当前所有线程的运行情况和线程当前状态,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题,jstack 19825 > error.log
可以把该文件下载到本地或者直接在Linux上分析,首先,需要把刚才的四个PID 1482,27308,28575,和4466分别转换为16进制,在Window上可以使用计算器转换,在Linux上一般预装Python,可以命令行键入 Python,然后 print hex(num)直接转换为16进制:
通过该16进制可以在上面导出的JVM信息中方便的定位到该线程的位置:
从导出的JVM日志文件中分别找到了4个PID对应的线程位置,发现四个线程的状态都处于RUNNABLE下,RUNNABLE表示该线程正在执行,但这里明显是无法停止,我又重新导了几次JVM的状态日志,发现这4个线程总是处于RUNNABLE状态下。
从上图Java的调用关系看,也可以从 com.sun.jna.Function.invoke()方法看出,该线程使用JNA调用了本地的DLL类库出现了问题,该DLL是第三方库,所以要从该DLL入手。