一、CPU 占用高问题排查

  1. top 查看占用CPU高的进程
  2. top -Hp 进程号
  3. 显示进程中每个线程信息,配合jstack定位java线程运行情况
  4. # 线程详情
  5. jstack 线程PID
  6. # 查看堆内存中的对象的情况,如果有大量对象在持续被引用,没有被释放掉,
  7. # 就产生了内存泄露,要结合代码,把不用的对象释放掉
  8. jmap -histo 线程PID
  9. # 查看堆的使用情况,各个堆空间的占用情况
  10. jmap -heap
  11. # 查询进程id垃圾回收情况
  12. jstat -gcutil 线程PID

二、分配大量数据内存引起一直FGC而假死

  • 1、top查看CPU使用情况,CPU使用100%,内存使用60%
  • 2、top -Hc查询最耗CPU的线程,发现是GC线程(arthas、greys)
  • 3、查询了一下Java线程栈情况,发现所有线程都处于BLOCKED状态
  • 4、查询Java的垃圾回收情况(jstat -gcutil XXXX 2000 10),发现系统一直在GC、FGC
  • 5、dump对象情况(jmap -dump:format=b,file=dump.bin XXX)
  • 6、通过MAT分析dump文件,发现占用内存最大的对象,并分析出具体业务代码
  • 7、经过业务方分析,发现这个方法一次性查询了20多万数据,然后就导致了系统一直GC

参考