如果CPU资源使用严重,可通过如下命令查询
1) 查询获取当前使用进程的pid
ps -ef | grep 进程名
2) 打印当前java堆栈情况
jstack -l pid > /temp/cpuDump.log
3)查看当前进程消耗资源的线程pid
top -Hp pid
4) 将线程Pid转为16进制,根据该16进制值去打印的堆栈日志内查询,查看该线程所驻留的方法位置。
基本上这步已经能够定位大多数问题了,如果还不可以继续下面的操作。
5) 若依然无法定位问题,可以查看堆中对象数量和大小
jmap -histo pid
6) 另外可以通过如下命令生成堆dump文件拿到本地通过jdk/bin下自带的jvisualvm.exe打开图形化显示详细的内存信息。
jmap -dump:format=b,file=heapdump pid
备注:
堆Dump:反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,首先会怀疑内存泄漏,这个时候就会去打印堆Dump。
jstack : 主要用于生成指定进程当前时刻的线程快照,线程快照是当前java虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。
jmap:可用于打印指定java进程的共享对象内存映射或堆内存细节。