方法1
1.使用top查看CPU使用率高的pid

假如进程125697为cpu占用过高的进程
2.使用top -Hp pid 查看进程下所有线程的运行情况

假如线程125902占用cpu过高
3.使用printf ‘%x\n’ 线程ID 将线程ID转换成16进制
结果为 1ebce4.用jstack 进程id | grep 16进制线程id 找到线程信息

5.可根据更多的jstack信息,找到代码报错信息,定位问题原因
方法2
1.使用jstat -gcutil pid 查看gc情况

年轻代和老年代比例正常,没有full gc
2.使用jmap -dump:live,file=dumpfile pid 导出dumpfile分析
3.使用jhat dumpfile
执行后等待console 中输出start HTTP server on port 7000 即可使用浏览器访问 IP:7000
由于我导出的dump文件太大,jhat有内存溢出的错误,使用jhat -J-Xmx4096m 指定内存也不行
4.使用JProfiler分析dump文件 (dump后缀改成hprof才能被打开)

由图1可以发现,DriverBg和LinkedList&Node被实例化了很多次,
图2可以发现序列化的时候写入了大对象,检查代码发现有个地方业务上没有限制,导致了查询数据库时扫描了全库,全部放到了list中,并且将结果全部序列化之后放到了redis,导致redis的读写很慢!
总结
经过这次的事故,简单学习了jstat,jmap,jstack等内存分析命令,之后可以深入学习这些命令,在jvm调优中可以有更好的应用