常见问题排查方法

一、CPU过高

1、确定问题进程:top查看CPU过高的线程ID:PID

2、确定问题进程中的问题线程:ps -mp pid -o THREAD,tid,time | sort -rn

3、将线程ID转换成16进制:printf "%x\n" tid

4、打印进程的堆栈信息并定位到问题线程:jstack pid | grep tid -A 30

 

二、堆转储(dump文件)

a)什么是堆转储?

堆转储是某个时间点应用程序内存的快照。它包含信息,例如内存中的对象是什么,它们携带的值是什么,大小是什么,它们引用的其他对象是什么。

b)堆转储的外观如何?

可以在此处找到样本堆转储。(注意:它将采用二进制格式。因此您实际上无法读取它)。

c)堆转储在哪里使用?

堆转储主要用于解决与内存相关的OutOfMemoryError问题。

d)如何生成堆转储?

可以使用7个不同的选项从运行的应用程序中捕获堆转储。进行堆转储的最常见选项是使用“ jmap”工具。jmap工具位于JDK_HOME \ bin文件夹中。这是您需要发出以捕获的命令:

jmap -dump:format=b,

其中pid:是Java进程ID,应捕获其堆转储,而file-path:是将堆转储写入其中的文件路径。

e)如何理解堆转储?

堆转储文件为二进制格式,并且通常较大。除此之外,它们的格式严重缺乏文档。因此,您必须使用堆转储分析工具(在下一个问题中给出)来分析和理解它们。

f)使用哪些工具来分析堆转储?

以下是使用最广泛的堆转储分析工具:Eclipse MAT,HeapHero和JVisualVM。

 

参考:https://www.json.cn/blog/2021/0215/p-16984.html

https://www.cnblogs.com/duanxz/p/8510623.html

工具:arthas

 

三、线程转储

a)什么是线程转储?

线程转储是某个时间点在应用程序中运行的所有线程的快照。它包含有关应用程序中每个线程的所有信息,例如:线程状态,线程ID,本机ID,线程名称,堆栈跟踪,优先级。

b)在哪里使用线程转储?

线程转储主要用于解决生产问题,例如CPU尖峰,应用程序无响应,响应时间短,线程挂起,内存消耗高。

c)如何生成线程转储?

可以使用8个不同的选项从正在运行的应用程序中捕获线程转储。进行线程转储的最常见选项是使用“ jstack”工具。jstack工具位于JDK_HOME \ bin文件夹中。这是捕获线程转储所需发出的命令:

jstack -l <pid> > <file-path>

其中pid:是应捕获其线程转储的应用程序的进程ID,而file-path:是将写入线程转储的文件路径。

d)使用哪些工具来分析线程转储?

这里是使用最广泛的线程转储分析工具:fastThread,Samurai,IBM Thread&Monitor分析器,Visual VM。

 

参考:https://www.json.cn/blog/2021/0215/p-16984.html

 

posted @ 2021-07-20 17:05  隔壁老宋  阅读(236)  评论(0)    收藏  举报