转 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 ...
随机推荐
- kafka connect 使用说明
KAFKA CONNECT 使用说明 一.概述 kafka connect 是一个可扩展的.可靠的在kafka和其他系统之间流传输的数据工具.简而言之就是他可以通过Connector(连接器)简单.快 ...
- zabbix和iptables的nat表结合使用
A 机器要去访问C机器,但是无法直接访问到A可以访问到B机器,B机器可以访问到C机器这时候就可以再B机器设置nat,让A机器访问C机器 正好工作中zabbix server要监控2个http地址,缺无 ...
- devexpress gridview代码设置
39 //绑定DataTable 40 gridControl1.DataSource = dt; 41 gridView1.OptionsCustomization.AllowColumnMovin ...
- 信号监测---verilog
信号监测---verilog 此模块用于监测某一信号源是否持续稳定的传送. 监测思路:监测信号源高电平或者低电平的宽度是否始终保持一致(一定范围内允许有误差) `timescale 1ns / 1ps ...
- Tcl 编译成tbc文件
工具:tclpro1.4 下载地址:https://www.tcl.tk/software/tclpro/eval/1.4.html 永久license: Version 1.4: 1094-320 ...
- 解决讨厌的警告 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
问题: 执行任何hadoop命令,都会提示如下WARN.虽然影响不大,但是每次运行一个命令都有这么个WARN,让人很不爽,作为一个精致的男人, 必须要干掉它. [root@master logs]# ...
- C#-记录一些常见的语法特性
C#6.0的一些语法 一.Lambda表达式的一些运用 1.在属性.方法中应用 例如常规对属性的赋值: public bool IsNavigation { get { return this._na ...
- Python 目录整理
基础部分: 1 常量 2 字符编码 字符编码补充 3 编码集 4 break与continue 5装饰器 6 迭代器 7生成器 8面向过程 9模块 10包 11 递归调用 12文件的用途 13类 ...
- UIView和CALayer区别
(1)首先UIView可以响应用户的触摸事件,Layer不可以. (2)View中frame getter方法,bounds和center,UIView并没有做什么工作:它只是简单的各自调用它底层的C ...
- 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
爬虫1:Requests+Xpath 爬取豆瓣电影TOP [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]: ...