一,CPU 100% 问题排查
1.1、找到 cpu 占有率最高的 java 进程号
使用命令:
top -c
显示运行中的进程列表信息,shift + p
使列表按 cpu 使用率排序显示。
PID = 2227 的进程,cpu 使用率最高
1.2、根据进程号找到 cpu 占有率最高的线程号
使用命令: top -Hp {pid}
,同样 shift + p
可按 cpu 使用率对线程列表进行排序。
PID = 2228 的线程消耗 cpu 最高,十进制的 2228 转成十六进制 8b4
1.3、利用 jstack 生成虚拟机中所有线程的快照
jstack -l {pid} > {文件位置}
1.4、线程快照分析
把快照下载到本地进行分析,也可直接在 Linux 上分析,命令:
cat 2227.stack |grep '8b4' -C 5
至此定位到问题:
1.5、小结
找到 CPU 使用了最高的进程,利用 jstack 命令生成该进程下所有线程快照文件,分析快照文件查找问题。
二,内存泄露问题排查
2.1,找到内存占有率最高的进程号
使用命令: top -c
显示运行中的进程列表信息, shift + m
按内存使用率进行排序。
可以看到进程号: 2527,占用内存最高。
2.2,利用 jmap 生成堆转储快照
命令:
jmap -dump:format=b,file={path} {pid}
堆转储快照文件路径: /opt/heapdump_2527.hprof
2.3,利用 MAT 分析堆转储快照
将 heapdump_2448.phrof 下载到本地,利用 MAT 进行分析,定位问题。
2.4,小结
找到内存使用率最高的进程,利用 jmap 生成该进程的堆转储快照,利用堆转储快照分析工具分析问题。
三,生产配置自动生成 Dump 快照文件
发生 OOM 时,没配置自动生成 Dump 快照文件不就很尴尬吗?其实在很多时候我们是不知道何时会发生 OOM,所以需要在发生 OOM 时自动生成 dump 文件。其实很简单,只需要在启动时加上如下参数即可。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/dump/heapdump.hprof -XX:OnOutOfMemoryError=/opt/restart.sh
-Xms
: 初始堆大小。默认 (MaxHeapFreeRatio 参数可以调整) 空余堆内存小于 40%时,JVM就会增大堆直到 -Xmx 的最大限制。
-Xmx
: 最大堆大小。默认 (MaxHeapFreeRatio 参数可以调整) 空余堆内存大于 70% 时,JVM会减少堆直到 -Xms 的最小限制。
-XX:+HeapDumpOnOutOfMemoryError
:表示当 JVM 发生 OOM 时,自动生成 DUMP 文件 最重要的参数。
-XX:HeapDumpPath
:(可选)表示生成 DUMP 文件的路径, 可以指定文件名称, -XX:HeapDumpPath=${目录}/java_heapdump.hprof。若不指定文件名,默认为:java_pid_date_time_heapDump.hprof
-XX:OnOutOfMemoryError
:(可选)表示 OOM 时 需要触发的脚本,比如 重启动作,发送告警等等。
四,总结
3.1,排重步骤
1、先找到对应的进程: PID
2、生成线程快照 stack (或堆转储快照: hprof )
3、分析快照(或堆转储快照),定位问题
3.2,JVM 常用命令
jps:列出正在运行的虚拟机进程
jstat:监视虚拟机各种运行状态信息,可以显示虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
jinfo:实时查看和调整虚拟机各项参数
jmap:生成堆转储快照,也可以查询 finalize 执行队列、Java 堆和永久代的详细信息
jstack:生成虚拟机当前时刻的线程快照
jhat:虚拟机堆转储快照分析工具
评论区