查找现网环境中最耗费CPU的Java线程,并定位堆栈信息

参考:JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

下面通过一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep

第一步 先找出Java进程ID,我部署在服务器上的Java应用名称为mrf-center

[email protected]:/# ps -ef | grep mrf-center | grep -v grep
root     21711     1  1 14:47 pts/3    00:02:10 java -jar mrf-center.jar

得到进程ID为21711。

第二步 找出该进程内最耗费CPU的线程

可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我这里用第三个,输出如下:

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

printf "%x\n" 21742

得到21742的十六进制值为54ee,下面会用到。

第三步 找出最耗费CPU的线程对应的Java代码

轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:

[email protected]:/# jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]

可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait(),我找了下我的代码,定位到下面的代码:

// Idle wait
getLog().info("Thread [" + getName() + "] is idle waiting...");
schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting;
long now = System.currentTimeMillis();
long waitTime = now + getIdleWaitTime();
long timeUntilContinue = waitTime - now;
synchronized(sigLock) {
    try {
        if(!halted.get()) {
            sigLock.wait(timeUntilContinue);
        }
    }
    catch (InterruptedException ignore) {
    }
}

它是轮询任务的空闲等待代码,上面的sigLock.wait(timeUntilContinue)就对应了前面的Object.wait()。

注意:
也可以通过jstack命令将线程的堆栈通过 > 命令重定向到文件中,再在文件中根据线程ID的十六进制值,查找到相应的堆栈代码。

原文地址:https://www.cnblogs.com/z00377750/p/9136467.html

时间: 2024-07-30 09:26:18

查找现网环境中最耗费CPU的Java线程,并定位堆栈信息的相关文章

如何在离线或内网环境中设置Rancher 2.0

有时候,我们无法使用像GKE或AKE这样的托管服务,甚至处于离线或与外网隔离的状态,而无法直接访问互联网.然而,即使在这种情况下,仍然是有方法使用Rancher管理集群的. 本文中,我们将向你介绍如何在离线或内网环境中运行Rancher 2.0. 私有镜像库 因为所有与Rancher相关的服务都在容器中运行,因此首先你需要的是在环境中存储容器.在本文的示例中,我们将使用Docker Registry(Docker镜像仓库).如果你已经有了镜像仓库,可以跳过这些步骤. 注意:在Rancher 2.

Linux内网环境DNS修改域名指向,JAVA应用程序能否实时切换的问题总结

公司内网环境中许多调用资源(数据库.web接口等)都是通过内网DNS服务来进行域名-IP的映射. 但经常出现DNS映射修改完毕后,应用中连接的资源迟迟没有变更. 以前一直笼统的认为是linux的dns缓存导致,今天做了一次完整的分析,结果如下: 1.Linux系统的本地DNS的缓存 CentOS系统本身并不包含DNS的缓存机制,除非安装并启动了nscd服务(name server cache daemon). nscd服务启动后会默认为本地的所有dns解析做一层缓存,过期时间默认为3600秒,重

[转]生产环境中程序占用cpu过高的程序的排查办法

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环.以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题. 根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障. 通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题.但是,怎么定位到具体线程或者代码呢? 首先显示线程列表: ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程28802,占用CPU时间快两个小时了!

内网环境中公网域名解析成内网地址的问题

防火墙默认开启dns的alg功能,是不会把域名服务器回应的服务器公网地址反回给客户端的,只返回内网地址.  NAT设备对来自外网的DNS相应报文进行DNS ALG处理时,由于载荷中只包含域名和应用服务器的外网IP地址(不包含传输协议类型和端口号),当接口上存在多条NAT服务器配置且使用相同的外网地址而内网地址不同时,DNS ALG仅使用IP地址来匹配内部服务器可能会得到错误的匹配结果.因此需要借助DNS mapping的配置,指定域名与应用服务器的外网IP地址.端口和协议的映射关系,由域名获取应

JVM调优之jstack找出最耗cpu的线程并定位代码

一.jstack使用总结 分析java进程,cpu占用高的问题 { 1.找到cpu占用高的进程pid 在top中,按组合键: shift + h ,会按cpu使用从高到低排序2.找到cpu占用高的线程pid top -Hp cpu高的进程pid, shift +h 查找最高线程,显示线程3.jstack 进程的pid | grep -A 线程pid的十六进制 #分析Java应用程序线程堆栈dump出来 printf "%x\n" cpu高的线程pid ==> 得到十六进制 pyt

命令行分析java线程CPU占用

1.使用top命令找出占用cpu最高的JAVA进程pid号 2. 找出占用cpu最高的线程: top -Hp pid  -d 1 -n 1 3. 打印占CPU最高JAVA进程pid的堆栈信息 jstack pid > /tmp/stacktrace.log 4. 把占CPU最高线程号码换算成16进制到stacktrace.log中寻找对应线程16进制值找到线程代码.

生产环境中nginx既做web服务又做反向代理

一.写对于初入博客园的感想 众所周知,nginx是一个高性能的HTTP和反向代理服务器,在以前工作中要么实现http要么做反向代理或者负载均衡.尚未在同一台nginx或者集群上同时既实现HTTP又实现反向代理. 那么到底nginx能否既实现HTTP又实现反向代理呢? 答案是肯定的 刚好前段时间在实际项目中有一个类似的情况出现,由此与大伙分享,由于以前没有写博文的习惯,只习惯于自己记录操作实现步骤及稳定,在以前常遇见问题都是百度.谷歌,众位网友的博文帮助自己见解决了很多问题. 由此可见技术分享的重

小程序弱网环境卡顿怎么办?一招迅速提升小程序运行速度

2018 年 1 月 15 日,微信公开课 PRO 在广州正式"开课".与往年不同,今年的微信公开课将整场大会的焦点都放在了小程序上.从 2017 年 1 月上线到现在,小程序依托于微信这个庞大的流量机器,在不知不觉间构建了一个新型的移动互联网生态圈. 微信小程序从麦当劳.肯德基等在线点餐服务到共享单车.共享充电宝等租用服务,再到与京东.拼多多等电商结合,小程序正在全方位的"入侵"人们的衣食住行.  △ 知晓程序官网小程序分类 张小龙在微信公开课上讲到:"

转 JVM找出占用CPU最高的线程

这两天客户这边有一台服务器一到下午3点左右就开始卡住,页面无法访问,服务器CPU占用达到300%多开始以为只是可能只是意外事件,重启一下就好,但是发现重启之后没几分钟服务器马上又反应无法访问,我就开始检查自己写的代码是不是有什么非常消耗CPU资源的逻辑,但是找了一段时间之后还是一无所获,不过马上反应的就是先把最新提交发布的代码还原到上一个版本.但是没过多久还是反应服务器开始又开始无法访问了.于是就第一步: 通过 top命令查找到这个消耗CPU的进程号PID 8958 top第二步:使用 top