`
j2ee_yohn
  • 浏览: 172187 次
  • 性别: Icon_minigender_1
  • 来自: 湖南/株洲
社区版块
存档分类
最新评论

帮你大致定位到现场导致LOAD飙升的JVM线程

    博客分类:
  • java
阅读更多
帮你大致定位到现场导致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虚拟机)中所有线程的活动状态对于调试多线程程序至关重要。本文将详细讲解如何查看JVM中的线程活动情况,并提供相关示例代码。 首先,Java提供了`java.lang.management....

    JVM线程状态和Thread.sleep的实现原理探究.pdf

    在Java虚拟机(JVM)中,每个线程通常都是以一对一的关系映射到操作系统线程上的。然而,尽管两者在实现上是相互对应的,但在状态定义上,JVM分别对操作系统线程和Java线程定义了不同的状态。这些状态不仅帮助Java...

    vmmap 观察jvm内存 监控jvm jvm线程

    在Java开发过程中,对JVM(Java虚拟机)的...通过熟练使用`vmmap`以及结合其他JVM监控工具,开发者可以有效地进行问题定位,优化应用性能,确保JVM健康运行。记住,理解JVM内存管理机制是提升Java应用性能的关键步骤。

    jvm线程持续监控脚本

    jvm线程持续监控脚本

    Java分布式应用学习笔记03JVM对线程的资源同步和交互机制

    ### Java分布式应用学习笔记03:JVM对线程的资源同步和交互机制 在深入探讨Java虚拟机(JVM)如何处理线程间的资源同步与交互机制之前,我们先来明确几个关键概念:线程、多线程、同步、并发以及它们在Java中的实现...

    JavaJVM线程调优.pdf

    Java JVM 线程调优是提升程序性能的关键环节,主要涉及到线程栈大小的调整、偏向锁的使用以及自旋锁的优化等方面。本文将深入解析这些知识点,并提供相关建议。 1. **线程栈大小调整**: 线程栈用于存储方法调用的...

    JVM线程分析.pdf

    Java虚拟机(JVM)线程分析主要关注的是线程的状态和执行机制。在JVM中,线程的状态主要包括以下几个: 1. Runnable(可运行):这是线程正常执行时的状态,线程正在CPU上执行代码或等待CPU时间片。 2. Wait on ...

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    本文将探讨如何在Windows环境下通过简单的命令行工具来监控JVM实例的数量,以及如何进行线程测试,特别是在单例模式下的JVM实例验证。 首先,了解如何监控JVM实例数量。在Windows操作系统中,我们可以使用`jps`命令...

    java 核心知识 包含 JVM 线程 集合 数据库 算法 负载等一系列

    总之,Java的核心知识涵盖了广泛的领域,从底层的JVM到高层的应用设计,都需要深入理解和实践。只有全面掌握这些知识,才能成为一名优秀的Java开发者。而"JAVA核心知识点整理.pdf"这份资料,应该会提供一个很好的...

    JVM线程学习

    Java虚拟机(JVM)是Java程序运行的基础,它的线程模型对于理解多线程编程至关重要。线程在Java中是轻量级的进程,它们共享同一块内存空间,允许程序执行并发操作,提高系统资源利用率。本资料集合旨在深入探讨JVM...

    JVM+多线程.pdf

    对于大对象或长生命周期对象导致的频繁GC问题,可以利用jmap等工具分析堆内存文件,定位可疑对象,并结合GC原理和JVM参数设置进行分析。 ### JVM垃圾回收器的选择 JVM提供了多种垃圾收集器,每种收集器都有自己的...

    JVM 输出 GC 日志导致 JVM 卡住

    JVM 输出 GC 日志导致 JVM 卡住是一个复杂的问题,需要作者通过多方面的分析和监控来定位和解决问题。 知识点: 1. JVM 垃圾回收机制(Garbage Collection,GC) 2. JVM 日志配置,包括 GC 日志、JIT 编译日志和 ...

    IntelliJ IDEA 2019.3.1 x64 启动 failed to load jvm dll 用管理员才能打开的根本解决办法

    正常安装和配置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 系统 ... 必须用管理员才能打开...

    WAS性能调优对jvm、线程数、ORB大小的配置

    JVM是Java程序运行的平台,它的性能直接影响到应用的响应时间和资源利用率。在调优过程中,我们主要关注以下几个方面: 1. **垃圾收集器选择**:WebSphere性能调优-垃圾收集器.docx文件可能涵盖了不同类型的垃圾...

    【JAVA WEB实用技巧与优化方案】如何排查JVM线程和内存相关问题

    在Java Web开发中,性能优化和问题排查是关键任务,特别是涉及到JVM(Java虚拟机)的线程和内存管理。本文将详细讲解如何利用`javacore`和`heapdump`分析工具来解决相关问题。 `javacore`文件是JVM在特定时刻生成的...

    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面试-JVM+多线程v2 面试-...

    JVM,多线程,数据结构,集合的思维导图(集合)

    这是Java学习过程中整理搜集的关于JVM,多线程,数据结构,集合的思维导图,能够有效的进行系统的学习

Global site tag (gtag.js) - Google Analytics