jstack问题定位分析

简介: jstack问题定位分析

1、jstack是什么

jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用来打印出给定的java进程ID或者core file或者远程调试服务的java堆栈信息。

主要是用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环,请求外部资源导致的长时间等待等。

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程在后台做什么事,或者等待什么资源。

jstack的主要作用:帮助定位程序出现问题的原因,如长时间停顿、cpu占用率高等问题。

2、jstack的使用

jstack的使用可以结合top命令查看出当前系统cpu内存使用率最高的进程pid。

jstack的使用步骤为:

1、先使用jps、ps ef|grep java 查看当前Java进程的pid,严重的时候可以使用top命令查看当前系统cpu、内存使用率最高的进程pid。

[root@localhost opt]# top
top - 16:24:42 up 51 days, 20:51,  6 users,  load average: 2.31, 2.61, 2.82
Tasks: 1283 total,   1 running, 1282 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.7 us,  0.7 sy,  0.0 ni, 90.3 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem : 23083337+total, 12588844+free, 95284000 used,  9660940 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used. 13450121+avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4017 root      20   0 6675664   4.9g   5868 S 125.2  2.2  94141:37 xxxxx
29938 root      20   0   18.6g   2.5g  13828 S 110.8  1.1 122:35.90 java
12303 root      20   0 6861556 637644 264096 S  33.4  0.3   1537:42 xxxx
 3327 root      20   0 2951676 227816 156864 S   4.9  0.1 202:30.71 xxxx
 3874 root      20   0  355696   6792   5908 S   3.3  0.0   2660:46 xxxx
......

我们可以看到产生死锁的java进程的pid为29938

死锁:两个线程互相得到锁1、锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1.两者互相等待释放,于是就产生了死锁。

如何避免死锁产生:

1、按照顺序加锁:线程间加锁的顺序各不一致,就会导致死锁,如果每个线程都按同一个的加锁顺序这样就不会出现死锁。

2、获取锁时限;在每个获取锁的时候加上一个时限,如果超过某个时间就放弃获取锁。

3、死锁检测:按照线程间获取锁的关系检测线程之间是否发生死锁,如果发生死锁就执行一定的策略,如终断线程或回滚操作等。

2、使用top -Hp 29938 查看进程里面占用资源最多的线程。

[root@localhost opt]# top -Hp 29938
top - 16:25:22 up 51 days, 20:52,  6 users,  load average: 2.13, 2.53, 2.78
Threads: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
%Cpu(s):  9.2 us,  1.0 sy,  0.0 ni, 89.6 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem : 23083337+total, 12591091+free, 95194368 used,  9728104 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used. 13460681+avail Mem
 Unknown command - try 'h' for help
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
31201 root      20   0   18.6g   2.4g  13828 R 99.0  1.1 108:04.58 java
29945 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.57 java
29950 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.50 java
29954 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.57 java
29955 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.54 java
29958 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.56 java
29960 root      20   0   18.6g   2.4g  13828 S  0.7  1.1   0:32.56 java
........

此时我们可以看到占用资源最多的线程是:31201

3、然后使用printf "%x\n"  31201  把线程pid转换成16进制数,就得到了:79e1

[root@localhost opt]# printf "%x\n" 31201
79e1

4、使用jstack 29938 | grep -20 79e1命令查询该线程阻塞的地方。(其中的20表示20行)

然后追溯跟踪到的信息 ,然后根据提示去排查产生死锁的原因。

相关文章
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
1350 2
【Java】服务CPU占用率100%,教你用jstack排查定位
|
4月前
|
人工智能 Java 数据库
如何保证接口幂等性?
在分布式系统中,接口幂等性至关重要。本文详解其定义、重要性及实现方案,包括唯一索引、Token机制、分布式锁、状态机与版本号机制,并提供最佳实践建议,助你提升系统可靠性与用户体验。
532 1
|
4月前
|
Prometheus 监控 Cloud Native
Spring Boot 可视化监控
本文介绍了如何通过Spring Actuator、Micrometer、Prometheus和Grafana为Spring Boot应用程序添加监控功能。首先创建了一个Spring Boot应用,并配置了Spring Actuator以暴露健康状态和指标接口。接着,利用Micrometer收集应用性能数据,并通过Prometheus抓取这些数据进行存储。最后,使用Grafana将Prometheus中的数据可视化,展示在精美的仪表板上。整个过程简单易行,为Spring Boot应用提供了基本的监控能力,同时也为后续扩展更详细的监控指标奠定了基础。
690 2
|
9月前
|
人工智能 安全 Dubbo
Spring AI 智能体通过 MCP 集成本地文件数据
MCP 作为一款开放协议,直接规范了应用程序如何向 LLM 提供上下文。MCP 就像是面向 AI 应用程序的 USB-C 端口,正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 提供了一个将 AI 模型连接到不同数据源和工具的标准化方法。
3814 109
|
10月前
|
Java Maven
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
在执行Maven项目中的`install`命令时,遇到编译插件版本不匹配的错误。具体报错为:`maven-compiler-plugin:3.13.0`要求Maven版本至少为3.6.3。解决方案是将Maven版本升级到3.6.3或降低插件版本。本文详细介绍了如何下载、解压并配置Maven 3.6.3,包括环境变量设置和IDEA中的Maven配置,确保项目顺利编译。
11068 5
Maven编译报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0:compile 解决方案
|
11月前
|
消息中间件 存储 Kafka
RocketMQ 工作原理图解,看这篇就够了!
本文详细解析了 RocketMQ 的核心架构、消息领域模型、关键特性和应用场景,帮助深入理解消息中间件的工作原理。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
RocketMQ 工作原理图解,看这篇就够了!
|
11月前
|
安全 Java 测试技术
如何在 Spring Boot 中禁用 Actuator 端点安全?
如何在 Spring Boot 中禁用 Actuator 端点安全?
2050 1
|
11月前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
1777 2
|
11月前
|
算法 安全 物联网
关于SM2、SM3、SM4、SM9这四种国密算法
本文介绍了四种国密算法——SM2、SM3、SM4和SM9。SM2是一种基于椭圆曲线的非对称加密算法,用于数据加密和数字签名;SM3是哈希算法,用于数字签名和消息完整性验证;SM4是对称加密算法,用于数据加密和解密;SM9是基于标识的非对称密码算法,适用于物联网环境中的数据安全和隐私保护。
7685 0
|
Java
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
1220 2