Java问题定位之如何借助线程堆栈进行问题分析
在大型的应用中,线程堆栈打印出来特别多,如何从众多的信息中找到真正有用,有价值的信息,我们需要一定的技巧。本文对此详细介绍。
我们可以从三个方面分析:堆栈的局部信息,一次堆栈的统计信息,多个堆栈的对比信息。
- 从一次的堆栈信息中,我们可以直接获取以下信息:
- 每一个线程的调用关系,当前线程在调用哪些函数
- 每个线程的当前状态,持有哪些锁,在等待哪些锁?
- 从一次堆栈信息中,我们还可以统计以下信息:
- 是否有很多线程都在等待同一个锁,说明这个系统存在性能瓶颈,导致了锁竞争
- 当前线程的总数量
- 大多数线程在干什么,在执行什么代码?
- 从多次的堆栈信息中,可以得到以下信息:
- 一个线程是否长期执行,如果每次打印堆栈某个线程一直处于同样的调用上下文中,那么说明这个线程一直执行这段代码,此时要根据代码逻辑检查,是否合理。
- 某个线程是否长期存在获取不到锁的情况,线程是否永远得不到唤醒,如果某一个线程一直等在一个锁,就要检查占用这个锁的线程为什么不释放。
如果说打印一次线程堆栈是平面,那么打印多次就是立体了,我们可以看到一段运行的情况。
接下来从以下几个方面分析:
- 线程死锁分析
- java代码导致的cpu过高分析
- 死循环分析
- 资源不足分析性能瓶颈分析
线程死锁分析
Java代码死循环等导致的cpu过高的分析
- 通过上一篇文章介绍过的方法打印第一次堆栈信息
- 等待一定时间,再次打印第二次堆栈信息
- 预处理2次堆栈信息,首先排除等待状态的线程,这种状态的线程不消耗cpu,前面已经讲过。我们只关注runnable状态的线程。
- 比较前后2次预处理后的线程,找出一段时间一直活跃的线程,如果2次堆栈信息在同一个线程处于同样的调用上下文,就列为重点怀疑对象。接下来结合代码逻辑检查该线程执行的上下文所对应的代码是不是属于应该长期运行的代码。
资源不足等导致的性能下降分析
- 大量的线程停在同样的调用上下文上。
- 资源数量配置太小,如数据库连接数,如果系统压力过大,资源不足导致线程不能及时获得资源而等待在那里。
- 获得资源的线程把持资源时间太久,导致资源不足。比如把一段和操作数据库无关的代码放在获取数据库连接和释放数据库连接之间。
- 设计不合理导致的资源占用太久,比如sql没有加索引导致执行sql太慢。
- 资源用完后,没有关闭导致资源泄漏或者减少。
多个锁导致的锁链分析
- 看到有40多个线程在等待锁0xbef17078,首先找到已经占有这把锁的线程thread-196
- 看到thread-196占有锁,0xbef17078,但又在等待锁<0xbc7b4110>,那么此时需要再找占有<0xbc7b4110>这个锁的线程,即thread-609。
- 那么占有锁<0xbc7b4110>的线程是问题的根源,下一步就是查到底为什么这个线程长时间占有这个锁。可能的原因是持有这把锁的线程正在执行的代码性能比较低,导致占有时间过长。
Java问题定位之如何借助线程堆栈进行问题分析的更多相关文章
- 通过 Java 线程堆栈进行性能瓶颈分析
改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...
- 通过Java 线程堆栈进行性能瓶颈分析
改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...
- Java线程堆栈分析
不知觉间工作已有一年了,闲下来的时候总会思考下,作为一名Java程序员,不能一直停留在开发业务使用框架上面.老话说得好,机会是留给有准备的人的,因此,开始计划看一些Java底层一点的东西,尝试开始在学 ...
- Java问题定位之Java线程堆栈分析
采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...
- JAVA问题定位跟踪技术
常用的JAVA调试技巧: 线程堆栈解读 性能瓶颈分析 远程调试 内存泄露检测 常用工具集: proc工具集 系统跟踪命令truss/strace Core文件管理coreadm 进程状态监控prsta ...
- JVM:如何分析线程堆栈
英文原文:JVM: How to analyze Thread Dump 在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品 ...
- openjdk-alpine镜像无法打印线程堆栈和内存堆栈问题
基于openjdk:8u171-alpine构建的java镜像,使用jstack命令打印线程的时候会提示以下错误: /opt # ps -ef PID USER TIME COMMAND 1 root ...
- Java项目性能瓶颈分析及定位(八)——Java线程堆栈分析(五)
对于CPU而言,常见的瓶颈主要有两种:服务器的压力很小,但是CPU的利用率却很高,这样的性能瓶颈相对比较容易定位(好比我只是说了你一句,你就哭了,你的弱点立马就暴露出来了):给服务器施加的压力很大,但 ...
- 定位java程序中占用cpu最高的线程堆栈信息
找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...
随机推荐
- 【Leetcode】Permutation Sequence
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- Java Applet 素数小程序
en... 1. Applet 这个远古的东西,今天我同学让我帮他看看代码,说applet运行出错.额,反正闲着也是闲着,看看呗 ,结果看到代码...4 2.就是实现这破玩意 package calc ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- 毕业设计 python opencv实现车牌识别 矩形矫正
主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https://github.com/yinghualuow ...
- c# mvc会话过期设置
configuration 元素(常规设置架构) system.web 元素(ASP.NET 设置架构) sessionState 元素(ASP.NET 设置架构) <session ...
- day36 mysql 表的具体操作
一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset utf8; 1.2 数据库命名规则 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 ...
- day16 类之间的关系 特殊成员
类与类之间的关系1.依赖关系(一个对象当另一个对象的参数) 关系最浅, 特殊成员: 1. 类名() 会自动调用 __init__() class Foo: def__init__(self, nam ...
- 一个简单的基于MINI2440开发板的启动代码
1. S3C2440大概的启动流程(NAND启动): ①设置CPU为SVC模式 ②关闭看门狗 ③屏蔽中断 ④关闭MMU ⑤初始化时钟 ⑥初始化内存(SDRAM) ⑦初始化栈指针(SP, R13) ⑧初 ...
- Ubuntu14.10:Install Apache,PHP,Mysql以及扩展库
step 1: Apache sudo apt-get install apache2 After have apache2 installed, go to localhost by browser ...
- spring test: 配置文件优先级
application.properties 默认 application-xxx.properties 高 systemEnvironment 高 test/main/resources/ 同名文件 ...