jstack命令查看占用CPU高的线程堆栈信息

当Linux系统中Java程序导致CPU使用率过高时,可以通过一系列步骤来定位问题。首先使用`top`命令找到高CPU消耗的Java进程PID,接着使用`top -H -p <pid>`查看高负载线程。将高负载线程ID转为16进制后,利用`jstack`命令结合`grep`或输出到文件来获取线程堆栈信息。`jstack -l <pid>`可提供更详细的锁和混合模式信息,帮助诊断问题。

当linux出现cpu被java程序消耗过高时,我们使用jdk自带的jstack来分析:

1.使用top命令,找到cpu消耗很高的进程pid

(jps或或ps -ef|grep java也可以查看java进程)

语法:top

2、查看高负载进程下的高负载线程

语法:top -H -p <pid>

eg: top -H -p 13769

3、将高负载线程号转换成16进制

语法: printf "%x\n" <pid>

eg: printf "%x\n" 14821

4、然后再使用jstack查询线程的堆栈信息

这里有两种方式:

4.1、直接在服务器窗口上通过命令查看:

语法:jstack <pid> | grep -a 线程id(十六进制)

eg: jstack 13769 | grep -a 39e5

这样就可以在服务器窗口上直接打印高负载线程的堆栈信息了

4.2、将对应进程的堆栈信息都打印出来存到文件中,

然后再在文件中搜索对应的线程号(16进制)进行查看:

语法:jstack -l <pid> >> 123.txt

eg: jstack -l 13769 >> 123.txt

a、打印jstack信息到文件(文件会保存在当前目录下)

b、导出进程的堆栈日志文件,找到39e5这个线程号,然后就可以跟踪代码找到对应的问题所在

(也可以使用jstack pid命令,查看pid的所有线程状态信息)

另外,导出堆栈信息文件的命令中一般有两个运行参数,用来拍取内存快照,

他们的含义如下:

-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)

 

### 使用 Jstack 命令查看 JVM 的线程和 GC 情况 Jstack 是一种强大的工具,用于生成 Java 线程堆栈转储信息。通过这些信息,可以深入了解 JVM 的运行状况以及线程的状态。以下是关于如何使用 Jstack 查看 JVM 的线程和 GC 情况的相关内容。 #### 1. 查看指定进程的线程堆栈信息 可以通过以下命令获取指定 Java 进程的线程堆栈信息: ```bash jstack <pid> ``` 其中 `<pid>` 是目标 Java 进程的进程 ID。此命令将输出当前时间点该进程的所有线程堆栈信息[^1]。 如果需要将堆栈信息保存到文件中以便后续分析,可以使用重定向操作符: ```bash jstack <pid> > thread_dump.txt ``` 这样会将线程堆栈信息写入 `thread_dump.txt` 文件中[^3]。 #### 2. 包含本地方法堆栈信息 默认情况下,Jstack 只显示 Java 层面的堆栈信息。如果希望同时包含本地方法(Native Method)的堆栈信息,可以使用 `-m` 参数: ```bash jstack -m <pid> ``` 此命令会输出包括本地代码在内的完整堆栈信息,这对于分析涉及本地库调用的问题非常有用。 #### 3. 分析线程状态 在生成的线程堆栈信息中,每个线程都会标注其状态(如 RUNNABLE、WAITING、BLOCKED 等)。通过分析这些状态,可以判断是否存在死锁、线程阻塞或其他性能问题。例如,如果发现大量线程处于 BLOCKED 状态,则可能表明存在资源竞争或同步问题[^2]。 #### 4. 查找垃圾回收 (GC) 相关线程 JVM 中的垃圾回收器通常由特定的线程负责执行。在生成的线程堆栈信息中,可以搜索与 GC 相关的线程名称(如 `G1 Main Marker` 或 `Concurrent Mark-Sweep`),以了解 GC 的运行情况。例如: - 如果发现 `G1 Main Marker` 线程频繁运行,可能表明 G1 垃圾回收器正在进行标记阶段。 - 如果看到 `Concurrent Mark-Sweep` 线程活动较多,可能是 CMS 收集器正在清理老年代对象。 #### 5. 定位 CPU 消耗的线程 如果需要排查 CPU 消耗问题,可以结合操作系统工具(如 `top` 或 `jps`)找到对应的 Java 进程 ID,然后使用 Jstack 获取线程堆栈信息。通过分析堆栈信息中的热点方法,可以定位导致 CPU 占用的具体代码位置[^2]。 --- ### 示例代码 以下是一个简单的脚本,用于自动获取并保存线程堆栈信息: ```bash #!/bin/bash PID=$1 if [ -z "$PID" ]; then echo "Usage: $0 <pid>" exit 1 fi jstack $PID > thread_dump_$PID_$(date +%Y%m%d%H%M%S).txt echo "Thread dump saved to thread_dump_$PID_$(date +%Y%m%d%H%M%S).txt" ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值