原文:https://www.iteye.com/blog/tyrion-2293369

上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题了,现在将问题排查步骤总结记录一下。

1.通过top命令查看当前机器的CPU使用情况


此时发现如果是Java的进程占用过高,并且一直下不来,则排查是什么线程导致占比过高。以图中进程举例,假如发现PID为31357的Java进程占CPU比一直很高,则记录下它的PID

2.查看Java进程里面的线程的占用情况

top -H -p 31357

说明:-H 指显示线程,-p 是指定进程


可以看到CPU占用较高的线程,记下他们的PID,假设这里31357的CPU占比一直是50%

3.通过jstack命令获取占用资源异常的线程栈,可暂时保存到一个文件中查看

jstack 31357 > jstack.31357.log


以上能看到指定线程的堆栈信息。

如果想看到关于线程中的锁的附加信息,可以加一个-l参数

4.上面方法用于进程正常情况下的堆栈打印,今天碰到的是用jstack -l命令没有响应,估计是CPU一直站着不能执行正常的命令,根据提示[The -F option can be used when the target process is not responding]只能放大招了。

jstack -F “PID” > jstack.“PID”.txt

吐出的实际日志结果如下:


发现一大坨线程阻塞了,有用的结果在这里:

显然一直在跑的是19576这个线程,一直在执行EXCEL导出的相关方法,问题就出在这里,下面的任务就是排查这个地方的代码逻辑了。

jstack命令格式:

jstack [ option ] pid

参数说明:

-F jstack [-l] pid无法响应时,强制打印堆栈

-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m 混合模式输出(包括java和本地c/c++片段)堆栈。

pid: java应用程序的进程号

记得没错的话这几个参数是互斥的,不能联合使用。

5.后来搜资料发现用jps命令查看java进程的pid更实用:

命令格式

jps [ options ] [ hostid ]

参数说明

-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。

-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

-v 输出传给JVM的参数。

三个参数加在一起显示更详细的信息:


发现这些Java进程的启动参数中开放了JMX的远程端口,正常情况下可以通过jconsole远程连接过去看到JVM的日常参数。比如本地访问上图中的pay.war进程:

一个线上JVM的CPU资源占用过高问题的排查的更多相关文章

  1. JVM的CPU资源占用过高问题的排查

    互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA JVM的CPU资源占用过高问题的排查 互联网后端架构  今天 上午线上某应用的一台J ...

  2. 【转】关于JVM CPU资源占用过高的问题排查

    http://my.oschina.net/shipley/blog/520062 一.背景: 先执行一个java程序里面开了两个线程分别都在while循环做打印操作. ? 1 # java -cp  ...

  3. linux--关于JVM CPU资源占用过高的问题排查

    一.背景: 先执行一个java程序里面开了两个线程分别都在while循环做打印操作. # java -cp ./test-threads.jar com.spiro.Main 二.现象: 通过top命 ...

  4. 一次线上redis实例cpu占用率过高问题优化(转)

    前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis.然后自然而然就把redis也挪到我 ...

  5. 【原创】面向对象版本地CPU资源占用监控脚本

    前期准备: 1.python2.7环境 2.相关第三方库下载安装 脚本工作过程: 1.根据输入的进程名判断进程是否存在,如果不存在则进行等待,直到检测到进程PID,中途进程退出抛出异常,键入enter ...

  6. 01 . Go之Gin+Vue开发一个线上外卖应用

    项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...

  7. Android While 循环导致的资源占用过高进而导致程序崩溃问题

    Timeline: Activity_launch_request time:6562004-14 15:31:25.347: I/dalvikvm(3483): Total arena pages ...

  8. 转:一篇讲线上优化查 CPU的脚本

    原文链接:https://my.oschina.net/leejun2005/blog/1524687   摘要: 本文主要针对 Java 服务而言 0.背景 经常做后端服务开发的同学,或多或少都遇到 ...

  9. 大厂面试经:说一下你们线上JVM是如何优化的?

    JVM(Java虚拟机)简单来说就是运行Java代码的解释器,作为螺丝钉程序员JVM其实了解下就差不多啦,不懂JVM内部细节照样能写出优质的代码!但是一到造火箭.飞机的场景(面试)不懂JVM的你,会被 ...

随机推荐

  1. Java8 特性

    1.jdk8的特性stream().map() 2.Java8中用Lambda表达式的groupBy合并多个相同属性的对象集合 3.Java8 Stream 语法详解 & 用法实例

  2. opencc介绍

    1.什么是opencc? Open Chinese Convert(OpenCC)是一个开源的中文简繁转换项目,致力于制作高质量的基于统计预料的简繁转换词库.还提供函数库(libopencc).命令行 ...

  3. oracle全库查找是否有某个值

    在scott用户下面,搜索含有'要找的值'的数据的表和字段穷举法: declare v_Sql ); v_count number; begin for xx in (select t.OWNER, ...

  4. windows下的计算时间间隔 -- GetTickCount()

    用法: #include "windows.h" DWORD lastTime =0;DWORD currentTime = 0;DWORD spendTime = 0; last ...

  5. ajax中如何使用全局变量?

    在ajax中一般都是采取默认的异步请求,但是有时候参数是需要做到全局通用,这时候发起同步请求. 如下: $.ajax({ type:"post", url:"url路径& ...

  6. 文件和异常练习——python编程从入门到实践

    10-1 Python学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学习到的python知识,其中每一行都以“In Python you can”打头.将这和文件命名为learning ...

  7. Source Insight4.0软件破解版

    安装source insightt4.0 1.将下载好的sourceinsight4.exe替换安装在program file(x86)目录下的sourceinsight4.exe; 2.启动sour ...

  8. go 指针 通过指针修改int类型的值

    指针的定义 :var p *int 取指针的值 :*p ------------------------------------------------------------------------ ...

  9. sqlserver通过递归查找所有下级或上级部门和用户的操作实例

    --查找当前用户所在部门的所有下级包括当前部门 with cte as ( as lvl from Department union all from cte c inner join Departm ...

  10. webpack4基础入门操作(二)(讲解下webpack的配置内容)

    前序:我之所以开始写这个系列,是因为我最近出去看了下外面的情况,发现技术更新的脚步太快了.我的技术栈已经完全落伍了. 所以准备今年学习写新的东西,而React.webPack4就是我的第一步.前面我看 ...