这两天客户这边有一台服务器一到下午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最高的线程的更多相关文章

  1. java:找出占用CPU资源最多的那个线程(HOW TO)

    在这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结:linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资 ...

  2. java:找出占用CPU资源最多的那个线程

    linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: 1.先用top命令找出占用资源厉害的java进程id,如: 2 ...

  3. 05 找出占用CPU、内存过高的进程

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin echo "----- ...

  4. 定位java程序中占用cpu最高的线程堆栈信息

    找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...

  5. 使用top工具,找出消耗CPU 较多的进程

    1.使用top工具,找出消耗CPU 较多的进程 [oracle@cuug ~]$ top top - 10:48:27 up 23:15,  4 users,  load average: 1.09, ...

  6. Linux中找到占用cpu最高的线程

    在工作中,经常会碰到CPU占用100%的情况,那如何找到是那个线程占用了cpu呢? 1. top命令,找到cpu占用最高的进程 2. 查看该进程的线程, top  -p <pid> 3. ...

  7. 查看JAVA占用CPU高的线程日志

    # . 查看主进程占用cpu高 top # java # . 按照线程占用cpu由高到低进行排查: -o THREAD,tid, # USER %CPU PRI SCNT WCHAN USER SYS ...

  8. JVM 找出最耗 cpu的线程 并打印线程栈

    监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3 ...

  9. 找出程序cpu使用率高的原因

    确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |g ...

随机推荐

  1. EBS 新建消息并且通过fnd_message提示

    前台 定义消息  系统管理员->系统管理->消息        文本中可使用 &变量名 指定变量 代码调用方式:     fnd_message.set_name('CUX', ' ...

  2. KiCad 一款强大的 BOM 和 装配图生成插件

    KiCad 一款强大的 BOM 和 装配图生成插件 可以生成 BOM 和在线的图形. https://github.com/openscopeproject/InteractiveHtmlBom In ...

  3. 第5章 Hyperledger Fabric功能

    Hyperledger Fabric is a unique implementation of distributed ledger technology (DLT) that delivers e ...

  4. rust visual studio editoe & debugger

    step Visual studio Try VisualRust-0.1.2 (1).msi, error. find no vs2017 extension. try RustLanguageEx ...

  5. Eclipse中Java build path的使用

    1.Eclipse中,工程属性的Java Build Path的Library标签页下,有如下几个按钮:Add Jars...添加JAR包,是指本Eclipse当前包含的工程中的,在工程列表下选取即可 ...

  6. CSS3 Vendor-prefixing

    Browser vendors needed a way to add support for new features that were not yet standardized, but wit ...

  7. MariaDB——(二) MariaDB 10.0.15 日志文件—undo 日志

          日志的记录和维护是数据库中相当重要的内容,写这篇文章和后面几篇文章作为学习官网文档的笔记.MariaDB数据库日志可分为二进制日志.查询日志.错误日志.myISAM表日志.relay日志和 ...

  8. Mongodb中的 原子性 隔离性

    读写锁 Mongodb使用读写锁来来控制并发操作: 当进行读操作的时候会加读锁,这个时候其他读操作可以也获得读锁.但是不能或者写锁. 当进行写操作的时候会加写锁,这个时候不能进行其他的读操作和写操作. ...

  9. Spring AOP Capabilities and Goal

    Spring AOP是用纯的java实现的.不需要任何个性的实现过程.Spring AOP不需要控制类加载器,并且它适用于Servlet容器或者应用服务器. Spring AOP当前只支持方法执行的连 ...

  10. Pandas之Dataframe叠加,排序,统计,重新设置索引

    Pandas之Dataframe索引,排序,统计,重新设置索引 一:叠加 import pandas as pd a_list = [df1,df2,df3] add_data = pd.concat ...