最近生产系统遇到多次CPU或内存使用率飙升的问题。将分析过程和步骤总结一下:
1. 接收到告警以后到机房,执行top命令查看CPU和内存使用率。发现有一个CPU的使用率在90~100%居高不下,且是Java进程引起的。
2. 执行top -Hp pid(Java进程号)。观察得到持续占用CPU的线程号。
3. 执行jstack pid > jstack.log。得到Java进程的线程快照。
4.将之前有问题的线程号转换为16进制,在线程快照中查找到该线程。发现是JVM的垃圾回收线程。再搜索整个文件,没有被死锁的线程。于是怀疑内存没有正确释放,JAVA进程已使用的内存,已经达到了分配给JVM的最大内存。导致垃圾回收频繁执行FullGC,占用了CPU。
5. 执行jstat -gc pid 发现年轻代78%,老年代100%。进一步证实之前的怀疑。
6. 执行jmap -dump:format=b,file=dumpFileName pid 得到当前内存快照。
7. 使用eclipse的memory analyzer导入内存快照,进行分析。找出内存异常的对象。
8. 修改程序的BUG。
9. BUG修复以后,继续定时获取内存快照,持续观察。直到彻底解决问题。