经常发现系统load值高,然后想去查找具体是哪个java线程导致的,一般会使用top jstack等等,但是每次都是人肉操作,故希望能将这个过程自动化,故这里写了个脚本用于dump出当前耗cpu的java线程堆栈。
分析下脚本处理过程:
1:利用top H列出当前线程的情况
2:grep出线程id
3:转换为jstack中的十六进制的线程id
4:利用jstack dump出线程
5:grep出所需要的线程上下文
直接上脚本代码
top -b -H -n 1 -p $1 | fgrep java -m $2 | awk '{print "obase=16;"$1}' | bc | awk '{printf"nid=0x%s|",$0}'| awk '{print substr($0,1,length()-1)}' > /tmp/nid.log 2>&1 &
/opt/sun/java/bin/jstack -l $1 > /tmp/js.log 2>&1 &
wait
cat /tmp/nid.log && cat /tmp/nid.log |xargs -i egrep {} /tmp/js.log -A 10 -i
本想借助管道一个命令完全实现的,发现grep如果接受2个动态参数行不通,故拆分开用2个进程来做的
说明下使用方式
sh topJava.sh pid threadNum
topJava.sh :是这个脚本的名字
pid :是要监控的java进程的id,其实如果只有一个java进程,那我可以用另外神奇的命令帮你获得,不过为了通用还是当成参数了。
threadNum :是要监控的java线程的个数,例如我想看最耗cpu的5个线程,则传递5
这里完全是用shell脚本来实现的,当然也可以完全用java的方式实现,不过java实现起来没这么简单要用MBean还有jvm tools相关的类,写一坨代码做shell的事情划不来。
分享到:
相关推荐
这两个文件也可以手工生成,在 unix/linux 上,可以使用 ps -ef|grep java 命令找到 Java 进程 id,然后使用 kill -3 进程号命令生成这两个文件。 javacore 文件的分析可以帮助我们解决一些问题,如:100% CPU ...
Java线程 Dump(Thread Dump)是Java应用程序在特定时间点的线程状态快照,它包含每个线程的详细信息,如线程ID、线程名称、线程状态以及调用堆栈。当Java应用程序出现性能问题、死锁或者线程阻塞等情况时,Thread ...
Java线程转储(Thread Dump)是诊断Java应用程序性能问题和异常情况的重要工具。它提供了一个运行中的Java应用中所有线程的快照,详细显示每个线程的状态、堆栈跟踪以及线程名称。线程状态包括RUNNABLE、BLOCKED、...
在Java开发过程中,有时会遇到项目运行时CPU占用率达到100%的问题,这可能是由于某个线程的无限循环、阻塞或者资源消耗过大导致的。以下是一套详细的排查步骤来帮助你找出是哪个jar包的哪个线程造成了这个问题。 ...
本文将深入探讨Java线程Dump的概念、生成方式以及如何通过分析线程Dump来诊断和解决性能瓶颈。 **第1章 JAVA线程DUMP** 1.1 什么是JAVA线程DUMP Java线程Dump,也称为线程快照,是JVM在特定时刻捕获的所有活动...
获取Threaddump可以通过操作系统命令,例如在Unix/Linux系统中,可以使用kill -3命令发送信号到运行WebLogic的Java进程来生成Threaddump。此外,WebLogic控制台也提供了生成Threaddump的功能。 #### 4.3 Threaddump...
3. 如果CPU使用率超过阈值,执行线程转储(JVM Thread Dump)。这可以通过发送特定信号(如`kill -3 <pid>`)给Java进程来完成,其中`<pid>`是Java应用的进程ID。 4. 收集生成的线程转储文件,通常以`.hprof`或`.txt...
`: 向Tomcat进程发送SIGQUIT信号,触发Java线程dump。 - `echo "tomcat thread dump end" >> $log;`: 记录到日志文件,表明结束Tomcat线程dump。 #### 进阶技巧与扩展 - **其他/proc 文件**: - `/proc/meminfo`: ...
jvisualvm是Java虚拟机监控工具,可以监控线程、内存情况、查看方法的CPU时间和内存中的对象、已被GC的对象,反向查看分配的堆栈。jvisualvm.exe文件包含在JDK的bin目录下,可以双击打开,基于NetBeans开发的UI简洁...
11561 inforsui 20 0 49.9g 6.0g 72m R 100.0 2.7 5194:12 java(耗cpu的线程) ``` 可以看到,PID为11561的线程(对应于Java进程中的某个线程)正在大量消耗CPU资源。为了进一步定位问题所在的具体线程,我们可以...
找出CPU占用率高的线程后,记录下其线程ID。线程ID是定位问题的关键,因为进程内部的线程可能有多个,每个线程都有自己的执行路径。 接下来,使用`jstack`命令对目标进程进行线程堆栈跟踪。`jstack`是Java提供的一...
13. 如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长?:可以使用相应的命令行工具,例如top命令在 Linux 上,tasklist命令在 Windows 上。 14. 如何使用 thread dump?如何分析 Thread dump?:Thread ...
它能够帮助我们查看javacore文件中的线程状态,分析哪些线程可能阻塞了其他线程,或者消耗了大量的CPU资源。线程的状态包括运行、等待、阻塞、新生、可运行等,不同的状态反映了线程的不同活动情况。 使用"Thread...
对于SUN JDK而言,在Windows和Linux操作系统中采用了“一对一”线程模型。 **内核线程方式:** 1. 如果操作系统内核包含线程调度器,则可由内核直接调度内核线程并将线程任务映射到各个CPU上。 2. 应用程序不能...
#### 一、Java线程堆栈分析 ##### 1.1 如何输出线程堆栈? **输出线程堆栈的方法**主要包括以下几种: 1. **命令行工具:** - `jstack`: 这是JDK自带的一个非常实用的命令行工具,可以用来查看Java进程中每个...
`jconsole`和`jvisualvm`都是图形化的性能监控工具,它们提供了丰富的界面,可以实时监控Java应用的CPU使用、内存分配、线程状态等。`jvisualvm`还支持生成各种报告和分析堆内存转储。 `jhat`是一个命令行工具,...
当发现Java应用程序CPU占用率异常高时,首先可以通过Linux中的`top`命令来检查进程情况。具体步骤如下: 1. **运行top命令**: 输入`top`回车。 2. **定位Java进程**: 在显示的进程中找到Java进程对应的PID(Process...
资料中提到了在Linux和Windows环境下进行线程Dump的方法: - **Linux**:使用`kill -3 <pid>`命令,将导致Tomcat输出线程dump到`catalina.out`文件中。 - **Windows**:使用`Ctrl + Shift + Break`组合键。 这些...