随笔 - 361,  文章 - 0,  评论 - 62,  阅读 - 160万

  jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。

寻找进程

  执行命令jps找出Java进程ID,服务器上的Java应用名称为:

[root@oms ~]# jps
29188 Jps
1381 WrapperSimpleApp
22343 Bootstrap

  也可以使用ps命令找出对应进程的进程ID:

[root@oms ~]# ps -aux|grep tomcat
root     22343 14.6 21.5 4001076 837176 ?      Sl   Mar04 286:30 /usr/lib/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/
logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Xdebug 
-Xrunjdwp:transport=dt_socket,address=60022,suspend=n,server=y -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath 
/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat 
-Dcatalina.home=/usr/lcoal/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

寻找线程

得到进程ID为22343,第二步找出该进程内最耗费CPU的线程,可以使用:
#1    ps -Lfp pid
#2    ps -mp pid -o THREAD, tid, time
#3    top -Hp pid
用第三个,输出如下:

  TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用

[root@oms ~]# printf "%x\n" 22414
578e

  得到22414的十六进制值为578e。

JStack查看分析线程及代码

[root@oms ~]# jstack 22343|grep -A10 578e
"QueryCdrDataManager" #70 daemon prio=5 os_prio=0 tid=0x00007ff068fc3000 nid=0x578e waiting on condition [0x00007ff051fe8000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at com.houjing.test.thread.DataManager.run(DataManager.java:134)

  由此可知这个线程当前正在执行这段代码:com.houjing.test.thread.DataManager.run(DataManager.java:134)

  另:对于windows的分析请转至网友的另一篇博客:windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码

posted on   kosamino  阅读(1800)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示