CPU 100% 处理流程
当我们遇到 CPU 使用率过高的情况时(这里只考虑 Linux/Solaris
系统)
首先想到了 top
指令
> top
先看看哪个进程使用的cpu 比较高, 当然这里只讲 JVM 使用 CPU 过高的情况;
这里的图片只是示例用,不存在cpu 使用率过高的问题
在查询到 vmid 后,查询虚拟机进程中哪个线程使用的 cpu 比较高
> ps -mp pid -o THREAD,tid,time
确定了使用 cpu 过高的虚拟机线程 id 后,记录下 threadId
然后再使用 jstack
记录当前虚拟机线程信息快照
$ jstack -l vmid > outofcpu.threaddump
这里已经获得了 threadId
和 当前的虚拟机线程信息快照信息
我们可以考虑重启一下 tomcat 或者直接重启 JVM
对于保存的 threadId
和 outofcpu.threaddump
在 threaddump 文件中查看 threadId 线程信息定位代码问题,达到修复目的
内存使用过高处理流程
当我们遇到 内存
使用率过高的情况时(这里只考虑 Linux/Solaris
系统)
首先想到了还是 top
指令
我们看到这里的tomcat 占用内存大到了 60% 多, 记录下 vmid
下面我们尝试查看这个进程中具体线程的内存使用情况
这里可以看出
ps 指令无法查询进程中具体线程的内存适用情况
不过我们还有 java 提供的工具 jmap
> sudo jmap -F -histo 12788 > test.dump
这里使用 jmap -histo
指令去 统计 JVM 堆中的对象信息
> sudo jmap -F -dump:format=b,file=test.all.dump 12788
这里使用 jmap -dump
指令去生成JVM 堆存储快照, 后面在用 jhat visualvm 等工具进行分析
在分析之前,我们可以考虑一下是否需要重启服务
这里在介绍一下 ps 的具体使用
-m: 显示当前 process id
进程下的线程的信息
-o: 用户自定义显示列