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

top
第二步:使用 top -Hp pid(shift+p 按cpu排序,shift+m 按内存排序)
top -Hp 8958
获取到这个进程下面所有线程,通过查看%CPU找到最耗费CPU的是线程PID

第三步:使用 printf '%x\n' PID (PID为上一步中获取到的线程号)转换成对应的16进制PID 5c7e
第四步:使用jstack 获取对应的线程信息
jstack 8958 | grep 5c7e
注意:8958是一开始获取的进程号,而5c7e则是这个进程下面最最耗费CPU的线程号
根据上图我们可以看到名叫GC task thread#2 (ParallelGC)就是这个线程消耗了大量的CPU。这个线程是一个垃圾回收线程,垃圾回收线程大量占用CPU 说明我们的JVM内存被消耗得很快,导致垃圾回收器不断地回收内存而消耗CPU,而内存消耗的很快就跟我们的代码有关系,说明我们的代码创建了大量的对象或者执行了其他消耗内存的操作,这需要检查这个时期的其他线程在做一些什么工作而导致消耗了大量的内存
第五步:jstack pid(进程pid)>stack.dump
执行上面的命令,将该消耗进程的线程相关信息导出到stack.dump文件中,打开这个文件查看每个线程的具体状态
一般来说,出现问题的代码大多数是我们自己写的业务代码导致的,所以我们可以通过查看那些我们自己创建的类的相关信息,比如根据我们自己创建的包路径去搜索,搜索结果可能不止一个地方会出现我们的包路径,这个就需要结合我们自己的代码的业务逻辑来定位到底是哪一个线程可能出现问题了。
下面是这次我遇到的问题例子:
像我遇到的这个问题,这一个正在执行的线程是一个用户上传导入Excel的操作,而这个用户导入的Excel中每行有非常多的多余的空白列他没有删除,而且又有非常多的多余的空白行,而我们的代码是需要去读取每行的每一列,这就导致代码创建了大量的对象,最后使得内存被消耗完,然后垃圾回收线程就开始不断地占用CPU回收内存了。
当然实际情况中还包括其他的一些原因状态导致的,比如说死锁,这都需要具体去分析导出的信息。
参考:https://blog.csdn.net/zxh87/article/details/52137335#!/_z838w71pwcr
---------------------
作者:notsaltedfish
来源:CSDN
原文:https://blog.csdn.net/notsaltedfish/article/details/80209538
转 JVM找出占用CPU最高的线程的更多相关文章
- java:找出占用CPU资源最多的那个线程(HOW TO)
在这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结:linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资 ...
- java:找出占用CPU资源最多的那个线程
linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 1.先用top命令找出占用资源厉害的java进程id,如: 2 ...
- 05 找出占用CPU、内存过高的进程
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin echo "----- ...
- 定位java程序中占用cpu最高的线程堆栈信息
找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...
- 使用top工具,找出消耗CPU 较多的进程
1.使用top工具,找出消耗CPU 较多的进程 [oracle@cuug ~]$ top top - 10:48:27 up 23:15, 4 users, load average: 1.09, ...
- Linux中找到占用cpu最高的线程
在工作中,经常会碰到CPU占用100%的情况,那如何找到是那个线程占用了cpu呢? 1. top命令,找到cpu占用最高的进程 2. 查看该进程的线程, top -p <pid> 3. ...
- 查看JAVA占用CPU高的线程日志
# . 查看主进程占用cpu高 top # java # . 按照线程占用cpu由高到低进行排查: -o THREAD,tid, # USER %CPU PRI SCNT WCHAN USER SYS ...
- JVM 找出最耗 cpu的线程 并打印线程栈
监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3 ...
- 找出程序cpu使用率高的原因
确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |g ...
随机推荐
- Netty中的基本组件及关系
原文:https://blog.csdn.net/summerZBH123/article/details/79344226--------------------- 概述 这篇文章主要是用来 ...
- 18.11 ROM、RAM、DRAM、SRAM和FLASH区别
ROM(Read Only Memory)和RAM(Random Access Memory)指的都是半导体存储器.ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,但 ...
- Flink
1. Flink表接受是基于dataset.datastream的:首先需要注册一个dataset,然后通过sql去查询这个dataset,返回的即使基于dataset查询结果,这个查询结构就是Fli ...
- docker中安装ps命令
apt-get update && apt-get install -y procps
- 斐讯N1折腾记
斐讯N1折腾记:运行 Linux 及优化 2018-06-23 37条评论 4,445次阅读 11人点赞 最后更新时间:2019年03月10日 咳咳咳,上篇教程教大家给斐讯 N1 降级并且刷了 ...
- Spring boot 线上部署
1.修改Spring Boot 1.添加:spring-boot-maven-plugin 插件 <build> <plugins> <plugin> <gr ...
- IMU(LPMS-B2) ROS下使用教程
一.基本信息 http://www.alubi.cn/lpms-b2/ 安装ros教程 http://wiki.ros.org/lpms_imu https://lp-research.com/ros ...
- docker的windows环境设置
1.下载docker-install.exe安装VirtualBox.Git.Boot2Docker for Windows 2.设置环境变量,启动boot2docker Core Linux. 可以 ...
- listener.starting()源码探究
容器启动时,监听器调用starting方法,本质是找到匹配的监听器,广播事件,开始监听 上节对寻找匹配监听器做了分析,其是这个过程比较重要的部分,本文开始监听,反而不是那么复杂,如下: 找匹配监听器就 ...
- 测试开发学习进阶教程 视频&PDF
测试开发学习进阶教程 视频&PDF,7天后失效,更多学习资料加Q群 https://pan.baidu.com/s/196KEo791NeZKyfV_E-36Uw 提取码: 41vu ...