侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

JVM常见线上问题:CPU 100%、内存泄露问题排查

再见理想
2022-05-27 / 0 评论 / 0 点赞 / 518 阅读 / 1,014 字

一,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:虚拟机堆转储快照分析工具

3.3,内存泄露、内存溢出和 CPU 100% 关系

文章参考

手撸线上故障 OOM + CPU居高不下

0

评论区