这两天客户这边有一台服务器一到下午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. C++ 属性类

    又一次向目标迈进了... 这次是实现一个物体所拥有的属性类.没什么好说的,非常简单. 因为我是C++新手,不知道对这次的实现有没有什么更好的实现方式.因为这个类对以后的进展很重要,而且,要充分考虑易用 ...

  2. Spring.factories扩展机制

    和Java SPI的扩展机制类似,Spring Boot采用了spring.factories的扩展机制,在很多spring的starter 包中都可以找到,通过在 META-INF/spring.f ...

  3. git 与 ftp 共同工作

    因git主要用于版本管理,代码同步方面,因临时调试等原因,需要使用ftp上传文件. 但因为git的账户为ubuntu,ftp是虚拟账户overlord 导致文件权限不同,出现的问题主要有: 1.ftp ...

  4. jupyter notebook快捷键使用指南

    Jupyter Notebook 是一个交互式笔记本程序, 其有丰富的快捷键来便捷的完成工作.Notebook 有两种键盘输入模式.即命令模式和编辑模式,这与 Vim 有些类似.在编辑模式下,可以往单 ...

  5. 【转】搭建和配置Syncthing发现和中继服务器

    搭建和配置Syncthing发现和中继服务器     折腾借口 Syncthing好是挺好的,但就是同步不给力,公共网络服务其质量参差不齐,网络也说不清.最好的解决方案还是自己搭建发现服务器Synct ...

  6. python中的RE模块

    re模块(* * * * *) 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列 ...

  7. eclipse项目上传服务器注意事项

    1.先准备服务器环境 2 数据库导入,tomcat安装 3 开放服务器端口,配置网络 4.修改本地代码修改为发布版本,即ip,账号密码数据库等 5 变动的信息应该写在配置文件或者一个全局产量中,这样才 ...

  8. getOrCreateEnvironment()方法源码探究

    该方法目的是创建一个环境对象,并且根据环境类型,自动判断是创建web环境对象,还是标准非web环境对象. 首先该方法源于prepareEnvironment准备环境: 然后进入该方法源码: 可以发现: ...

  9. 传统、VHD、VHDX性能对比测试(转帖)

    nkc3g4发表于 2014-4-30 16:24:41 传统.VHD.VHDX性能对比测试 - Windows To Go优盘系统 - 萝卜头IT论坛 - Powered by Discuz! ht ...

  10. 前端-JavaScript2-5——JavaScript之运算符进阶

    运算符(Operators,也翻译为操作符),是发起运算的最简单形式. 运算符的分类见仁见智,我们的课程对运算符进行如下分类: 数学运算符(Arithmetic operators) 比较运算符(Co ...