JVM内存及CPU占用过高排查

Posted ispotu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM内存及CPU占用过高排查相关的知识,希望对你有一定的参考价值。

问题排查方法

方法一

  1. 通过top命令查看当前CPU内存情况

    top
    86786  java         98.4 13:22.7
  2. 获得pid,通过top -H -p86786查看有问题的线程

    说明: -H 指显示线程,-p 是指定进程
  3. 可以看到两个CPU内存占用较高的线程,记下PID( 此处的PID即为线程ID标识) ,将其从十进制转成十六进制表示,如0x7f1

    printf "%x\\n" tid
    0x7f1
  4. 通过jstack命令获取当前线程栈,可暂时保存到一个文件tempfile.txt中,在tempfile.txt中查找nid=0x7f1的线程

    jstack pid | grep '0x7f1'

方法二

  1. 查进程ID ps -ef|grep java 或 ps -ef|grep java
  2. ps -mp 8514 -o THREAD,tid,time,pmem 查出进程下线程信息,可以查出%CPU高,TIME长的线程ID(tid)
  3. printf "%x\\n" 8593 tid(8593)转化为十六进制2191
  4. jstack 8514|grep 2191 打印出堆栈信息
  5. 查看进程GC情况

    jstat -gcutil < 进程号 > < 统计间隔毫秒 > < 统计次数 >

    查看某进程GC持续变化情况,如果发现返回中FGC很大且一直增大

    确认Full GC!

    或者使用

    jmap -heap < 进程ID >

    查看一下进程的堆内从是不是要溢出了,特别是老年代内从使用情况一般是达到阈值(具体看垃圾回收器和启动时配置的阈值)就会进程Full GC

    6.输出dump文件,借助工具查看程序实例个数

    jmap -dump:format=b,file=filename < PID > 导出某进程下内存heap到文件中,通过jdk自带 visualvm 或者 mat 工具查看内存中有哪些对象

常用命令

查看指定进程下线程的ID,时间, cpu内存情况并根据消耗时间排序
ps -mp 9793 -o user,pid,ppid,tid,time,%cpu,%mem,cmd | sort -rk5

jmap -histo 7498 | head -20:显示堆空间对应7498进程对应对象占用大小

参考:cpu过高和内存过高排查_单身贵族男的博客-CSDN博客

排查cpu飙升、内存过高_java老张的博客-CSDN博客

CPU占用过高排查实战-布布扣-bubuko.com

以上是关于JVM内存及CPU占用过高排查的主要内容,如果未能解决你的问题,请参考以下文章

JVM内存及CPU占用过高排查

JVM探秘:线上CPU占用过高故障排查

CPU占用过高问题的排查及解决

Filebeat占用内存和CPU过高问题排查

JVM排查问题实战

系统负载高,如何排查?