帮你大致定位到现场导致LOAD飙升的JVM线程
大家都有过遇到线上程序LOAD突然狂飙的场景,要排查到为何狂飙,我们当务之急就是要找到导致CPU飙升的原因。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。
很多人都或多或少的知道有这么一个脚本,能帮你大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下。
#!/bin/sh
# write by : oldmanpushcart@gmail.com
# date : 2014-01-16
# version : 0.07
typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_${pid}_$$.trace
$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu --no-headers\
| tail -$top\
| awk -v "pid=$pid" '$2==pid{print $4"\t"$6}'\
| while read line;
do
typeset nid=$(echo "$line"|awk '{printf("0x%x",$1)}')
typeset cpu=$(echo "$line"|awk '{print $2}')
awk -v "cpu=$cpu" '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="cpu"%");}' $tmp_file
done
rm -f $tmp_file
现在我们就来拆解其中的原理,以及说明下类似脚本的适用范围。
步骤1:dump当前JVM线程,保存现场
$JAVA_HOME/bin/jstack $pid > $tmp_file
保存现场是相当的重要,因为问题转瞬之间就会从手中溜走(但其实LOAD的统计机制也决定了,事实也并不是那么严格)
步骤2:找到当前CPU使用占比高的线程
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu
列说明
USER:进程归属用户
PID:进程号
PPID:父进程号
TID:线程号
%CPU:线程使用CPU占比(这里要提醒下各位,这个CPU占比是通过/proc计算得到,存在时间差)
步骤3:合并相关信息
我们需要关注的大概是3列:PID、TID、%CPU,我们通过PS拿到了TID,可以通过进制换算10-16得到jstack出来的JVM线程号
typeset nid="0x"$(echo "$line"|awk '{print $1}'|xargs -I{} echo "obase=16;{}"|bc|tr 'A-Z' 'a-z')
最后再将ps和jstack出来的信息进行一个匹配与合并。终于,得到我们最想要的信息
适用范围说明
看似这个脚本很牛X的样子,能直接定位到最耗费CPU的线程,开发再也不用担心找不到线上最有问题的代码~但,且慢,姑且注意下输出的结果,State: WAITING 这是这个啥节奏~
这是因为ps中的%CPU数据统计来自于/proc/stat,这个份数据并非实时的,而是取决于OS对其更新的频率,一般为1S。所以你看到的数据统计会和jstack出来的信息不一致也就是这个原因~但这份信息对持续LOAD由少数几个线程导致的问题排查还是非常给力的,因为这些固定少数几个线程会持续消耗CPU的资源,即使存在时间差,反正也都是这几个线程所导致。
这里分享下淘宝内部经常排查到的几个有问题线程,大家如果用到了又遇到LOAD突然飙高,可以优先怀疑他们。
Forest、CatServer、Notify
分享到:
相关推荐
在Java编程环境中,了解JVM(Java虚拟机)中所有线程的活动状态对于调试多线程程序至关重要。本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management....
在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是相互对应的,但在状态定义上,JVM分别对操作系统线程和Java线程定义了不同的状态。这些状态不仅帮助Java...
在Java开发过程中,对JVM(Java虚拟机)的...通过熟练使用`vmmap`以及结合其他JVM监控工具,开发者可以有效地进行问题定位,优化应用性能,确保JVM健康运行。记住,理解JVM内存管理机制是提升Java应用性能的关键步骤。
jvm线程持续监控脚本
### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...
Java JVM 线程调优是提升程序性能的关键环节,主要涉及到线程栈大小的调整、偏向锁的使用以及自旋锁的优化等方面。本文将深入解析这些知识点,并提供相关建议。 1. **线程栈大小调整**: 线程栈用于存储方法调用的...
Java虚拟机(JVM)线程分析主要关注的是线程的状态和执行机制。在JVM中,线程的状态主要包括以下几个: 1. Runnable(可运行):这是线程正常执行时的状态,线程正在CPU上执行代码或等待CPU时间片。 2. Wait on ...
本文将探讨如何在Windows环境下通过简单的命令行工具来监控JVM实例的数量,以及如何进行线程测试,特别是在单例模式下的JVM实例验证。 首先,了解如何监控JVM实例数量。在Windows操作系统中,我们可以使用`jps`命令...
总之,Java的核心知识涵盖了广泛的领域,从底层的JVM到高层的应用设计,都需要深入理解和实践。只有全面掌握这些知识,才能成为一名优秀的Java开发者。而"JAVA核心知识点整理.pdf"这份资料,应该会提供一个很好的...
Java虚拟机(JVM)是Java程序运行的基础,它的线程模型对于理解多线程编程至关重要。线程在Java中是轻量级的进程,它们共享同一块内存空间,允许程序执行并发操作,提高系统资源利用率。本资料集合旨在深入探讨JVM...
对于大对象或长生命周期对象导致的频繁GC问题,可以利用jmap等工具分析堆内存文件,定位可疑对象,并结合GC原理和JVM参数设置进行分析。 ### JVM垃圾回收器的选择 JVM提供了多种垃圾收集器,每种收集器都有自己的...
JVM 输出 GC 日志导致 JVM 卡住是一个复杂的问题,需要作者通过多方面的分析和监控来定位和解决问题。 知识点: 1. JVM 垃圾回收机制(Garbage Collection,GC) 2. JVM 日志配置,包括 GC 日志、JIT 编译日志和 ...
正常安装和配置JDK后,IntelliJ IDEA 2019.3.1 x64 启动仍然报 Failed to load JVM DLL 路径\jvm.dll if you already have a 64-bit JDK installed, define a JAVA_HOME variable in 系统 ... 必须用管理员才能打开...
JVM是Java程序运行的平台,它的性能直接影响到应用的响应时间和资源利用率。在调优过程中,我们主要关注以下几个方面: 1. **垃圾收集器选择**:WebSphere性能调优-垃圾收集器.docx文件可能涵盖了不同类型的垃圾...
在Java Web开发中,性能优化和问题排查是关键任务,特别是涉及到JVM(Java虚拟机)的线程和内存管理。本文将详细讲解如何利用`javacore`和`heapdump`分析工具来解决相关问题。 `javacore`文件是JVM在特定时刻生成的...
在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因。在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术。在线程堆栈中存储的信息,通常远超出你的想象,我们可以...
面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-JVM+多线程v2面试-JVM+多线程v2 面试-...
这是Java学习过程中整理搜集的关于JVM,多线程,数据结构,集合的思维导图,能够有效的进行系统的学习