JVM-Cpu飙升排查及解决

这篇具有很好参考价值的文章主要介绍了JVM-Cpu飙升排查及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://blog.csdn.net/m0_37542440/article/details/123679011

1. 问题情况
在服务器上执行某个任务时,系统突然运行缓慢,top 发现cpu飙升,一度接近100%,最终导致服务假死。

2. 问题排查
1. 执行 “top” 命令:查看所有进程占系统cpu的排序,极大可能排第一的就是自己的java进程,pid就是进程号。

2. 执行 “top -Hp 进程号” 命令:查看java进程下的所有线程占cpu情况。

3. 执行 “printf "%x\n" 10” 命令:后续查看线程堆栈信息展示的都是十六进制,为了找到咱们的线程堆栈信息,需要把线程号转为16进制。例如,printf "%x\n 10-》打印:a,那么在jstack中线程号就是0xa。

4. 执行 “jstack 进程号 | grep 线程id” 命令:查找某进程下-》线程id(jstack堆栈信息中的nid)=0xa的线程状态。如果“"VM Thread" os_prio=0 tid=0x00007f871806e000 nid=0xa runnable”,第一个双引号圈起来的就是线程名,如果是“VM Thread”这就是虚拟机GC回收线程了。

5. 执行 “jstat -gcutil 进程号 统计间隔毫秒 统计次数(缺省代表一致统一)”,查看某进程GC持续变化情况,如果发现返回中FGC很大且一直增大,确认Full GC 也可以使用“jmap -heap 进程ID”,查看一下进程堆内是不是要溢出了,特别是老年代内从使用情况一般是到达阈值(具体看垃圾回收器和启动配置的阈值)就回晋城Full GC。

6. 执行 “jmap -dump:format=b,file=filename 进程ID”,导致某进程下内存heap输出到文件中,可以通过eclipse的mat工具查看内存中有哪些对象比较多。

6-1. jmap 

jmap -dump:live,format=b,file=live_web_dump.hprof 22260

借鉴:JVM调优命令-jmap - 钰火 - 博客园

3. 原因分析
1. 内存消耗过啊,导致Full GC次数过多

执行步骤1-5:

多个线程的CPU都超过了100%,通过jstack命令可以看到这些线程主要是垃圾回收线程-》上一节步骤2
通过jstat命令监控GC情况,可以看到Full GC次数非常多,并且次数在不断增加。--》上一节步骤5
确定是Full GC,接下来找到具体原因:

生成大量的对象,导致内存溢出-》执行步骤6,查看具体内存对象占用情况。
内存占用不高,但是Full GC次数还是比较多,此时可能是代码中手动调用 System.gc()导致GC次数过多,这可以通过添加 -XX:+DisableExplicitGC来禁用JVM对显示GC的响应。
2.代码中有大量消耗CPU的操作,导致CPU过高,系统运行缓慢;

执行步骤1-4:在步骤4jstack,可直接定位到代码行。例如某些复杂算法,甚至算法BUG,无限循环递归等等。

3.由于锁使用不当,导致死锁。

执行步骤1-4: 如果有死锁,会直接提示。关键字:deadlock.步骤四,会打印出业务死锁的位置。

造成死锁的原因:最典型的就是2个线程互相等待对方持有的锁。

4.随机出现大量线程访问接口缓慢。

代码某个位置有阻塞性的操作,导致该功能调用整体比较耗时,但出现是比较随机的;平时消耗的CPU不多,而且占用的内存也不高。

思路:

首先找到该接口,通过压测工具不断加大访问力度,大量线程将阻塞于该阻塞点。

5.某个线程由于某种原因而进入WAITING状态,此时该功能整体不可用,但是无法复现;

执行步骤1-4:jstack多查询几次,每次间隔30秒,对比一直停留在parking 导致的WAITING状态的线程。例如CountDownLatch倒计时器,使得相关线程等待->AQS(AbstractQueuedSynchronizer AQS框架源码剖析)->LockSupport.park()。文章来源地址https://www.toymoban.com/news/detail-612152.html

到了这里,关于JVM-Cpu飙升排查及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 应用cpu飙升(超过100%)故障排查

    害。。。 昨天刚写完一份关于jvm问题排查相关的博客,今天线上项目就遇到了一个突发问题。 现象是用户反映系统非常卡,无法操作。 然后登录服务器查看发现cpu 一直100%以上。 发现线上pid 29737的 java应用cpu达到100% 输入上述命令,然后按H显示cpu最高排名的线程。可以看到

    2023年04月26日
    浏览(50)
  • Java线上服务CPU、内存飙升问题排查步骤!

    作为一名从事Java开发快一年的程序员,在线上经常碰到 某个模块的Pod发出CPU与内存告警的问题 ,而这些问题会导致系统响应缓慢甚至是服务不可用。一般情况下可以通过 重启 或者 调高Pod的资源量或者增加Pod数量 暂时解决问题,但这是治标不治本的,只有找到问题发生的原

    2024年02月16日
    浏览(37)
  • JVM问题排查

    本文详细说明了Java应用运行过程中几种常见的JVM相关问题,并给出了问题排查步骤。 现象 :Java线程负载过高,JVM内存几乎占满,甚至抛出java.lang.OutOfMemoryError错误。 思路 :通过jmap能查看到对内存中实例,可以查看到哪些类的实例比较多,排查出OOM原因。 工具 :jmap 步骤

    2024年02月09日
    浏览(30)
  • jvm堆外内存排查详解

    内存泄漏想必大家并不陌生,对于jvm的内存泄漏,有很多排查手段和方便的排查工具,例如MAL,但是对于非jvm的内存,如直接内存的使用,排查起来较为麻烦,下面介绍一下相关的排查手段 在一次内存检查的过程中,意外发现在linux的java进程内存占用,远高于jvm的内存设定最

    2024年02月08日
    浏览(28)
  • 【JVM】Java内存泄露的排查思路?

    Java内存泄露(Memory Leak)是指在Java程序中,无用的对象占用了 堆内存 ,但无法被垃圾回收器回收释放,从而导致可用内存逐渐减少,最终可能导致内存耗尽或性能下降的问题。 说明一般对于内存泄漏。都是针对 堆 的。 程序一般出现内存泄漏会有 两个状态 一是一启动导致

    2024年02月13日
    浏览(38)
  • jvm cpu 高定位

    快速的发现线程cpu高, 最终发现是gc线程, 最终去分析jvm  top -o %CPU top -Hp108920  jmap -dump:format=b,file=heap.bin 108920 jvm 命令和工具_个人渣记录仅为自己搜索用的博客-CSDN博客 $ jstat -gcold 108920 MC MU CCSC CCSU OC OU YGC FGC FGCT GCT 218368.0 212670.3 25344.0 23913.0 2355200.0 2355200.0 1191 9925 7594.058 7691.

    2024年02月08日
    浏览(24)
  • JVM笔记 —— 出现内存溢出错误时时如何排查

    内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的,无限递归导致超出栈内存(-Xss)限制时就会抛出StackOverflowError。这种情况直接根据异常

    2024年02月13日
    浏览(32)
  • 【Jvm】性能调优(上)线上问题排查工具汇总

    产品闭环 产品闭环是能够让 用户主动迭代促进产品发展的方式 。例如一些内容产品,比如 糗事百科 ,种子用户 产出高质量内容 ,举报与赞起到 筛选内容 ,提高内容质量的作用, 内容质量的提升有助于吸引更多用户 。 这就是产品闭环, 产品给予用户需求解决方法,用户

    2024年02月20日
    浏览(33)
  • 【Jvm】性能调优(下)线上问题排查思路汇总

    【Jvm】性能调优(上)线上问题排查工具汇总 【Jvm】性能调优(中)Java中不得不了解的OOM Error 标准参数(-) :所有的JVM实现都必须实现该功能且向后兼容 非标准参数(-X) : 默认Jvm实现该功能 ,但是不保证所有jvm实现都满足,且 不保证向后兼容 非稳定参数(-XX) : 各

    2024年02月21日
    浏览(39)
  • MySQL数据库CPU飙升到100%解决方案

    当cpu飙升到100%时,先用操作系统命令top命令观察是不是mysqld占用导致的,如果不是,找出占用高的进程,并进行相关处理。 进入mysql命令行 查看慢查询SQL是否启用:ON是开启,OFF是关闭。 show variables like ‘log_slow_queries’; 开启慢查询日志 set global log_slow_queries = on; 如果是mysql

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包