CPU100%、死锁、内存溢出的排查

CPU100%的排查

  1. 使用top或者pidstat命令, 查看系统性能数据, 可以找出CPU使用率较高的进程。(Top命令类似于Windows的资源管理器,它可以将进程的实时状态展示出来,包括CPU信息)
  2. 接着使用 top -H -p pid 将这个进程的线程显示出来。输入大写的 P 可以将线程按照 CPU 使用比例排序。
  3. 立马使用 jstack pid > pid.log 将线程栈 Dump 到日志文件中。
  4. 通过栈中的日志查看问题所在。

在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。

top -H

在这里插入图片描述
要让top输出某个特定进程并检查该进程内运行的线程状况:

top -H -p <pid>

在这里插入图片描述

死锁定位方法

  1. 如系统存在运行日志,首先分析日志信息。
  2. 使用jstack等工具获取到线程栈,命令格式为:jstack 。jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况,如下:
    在这里插入图片描述
  3. 基于thead dump分析当前各个线程的运行情况,重点关注线程的一些状态:Deadlock、Waiting on condition(等待资源)、Waiting on monitor entry(等待获取监视器)、Blocked(阻塞)
  4. 有些阻塞栈可能是因为它需要等待前面的线程执行结束才可以执行,所以要先确定依赖关系。
  5. 进而排查死锁。
  6. JConsole甚至可以在图形界面进行有限的死锁检测。

死锁:
https://blog.csdn.net/zbajie001/article/details/80045710
https://www.cnblogs.com/wuchanming/p/7766994.html

内存溢出的排查步骤

主要工具:jmap、mat工具。

步骤:

  1. 导出内存映像文件(两种方法)。
  2. 将down下的.hprof文件导入到MAT工具中进行分析。
  3. MAT工具已经分析出了占用内存最大的方法所在的类,再进一步分析观察所在类那个对象出现了问题。

导出内存映像文件

导出内存映像文件(两种方法):
1、VM参数方法,内存溢出自动导出
//设置自动导出以及导出到当前路径

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./

2、jmap命令,先运行对应的jar进程,jps找到该进程ID,然后jmap设置导出格式

jps
jmap -dump:format=b,file=heap.hprof <pid>

在这里插入图片描述

如果是在将要溢出前,选第二种,如果是已经内存溢出,选第一种(这是预防)。

扫描二维码关注公众号,回复: 10516446 查看本文章

将down下的.hprof文件导入到MAT工具中进行分析。

在这里插入图片描述

很显然,MAT工具已经分析出了占用内存最大的方法所在的类,再进一步分析观察所在类那个对象出现了问题。

在这里插入图片描述

https://blog.csdn.net/qq_41797857/article/details/91383000

发布了67 篇原创文章 · 获赞 32 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43751710/article/details/104900890