美文网首页
一次排查Jvm线程飙升问题的经历

一次排查Jvm线程飙升问题的经历

作者: 淡v漠 | 来源:发表于2021-02-22 15:00 被阅读0次

问题发现

通过线上Grafana监控发现某服务 JVM-Thread线程异常高,并且发现每天都在持续飙升,如下。

可看到jvm线程少说几百,多则几千甚至过万,并且如果服务不重启,可发现线程数随着时间的推移持续上升,并且没有下降趋势,因此可以看出服务中一定有某些编码没有使用线程池,在持续的new Thread()创建线程,导致线程数飙升。

定位问题

由于线上服务是云部署,在我们公司开发是没有权限登录服务终端查看应用jvm情况,包括线程信息,所以给定位带来的很多困难。

起初我们定位问题方案是通过测试环境开启Spring Actuator监控,通过访问 /actuator/threaddump获取运行时的线程dump信息,相当于直接在终端执行jstack命令获取jvm线程信息。然后在测试环境观察线程数量变化,通过几次的对比去判断哪些线程名在持续飙升,进而定位问题。

但一段时间过后,发现测试环境的线程数量变化并不是很明显,需要等很长一段时间才有可能看到明显的效果。所以放弃治疗。

无奈。就开始实现二套方案,直接找运维配合导出线上实例机器上的jvm-thread dump文件,然后直接分析thread-dump文件定位问题,文件大致内容如下。


这里分析的dump文件大致有480多k,如果一行行看起来也比较不清晰,所以直接上工具。
IBM JCA 工具 https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda
载入文件如下:
从可视化工具可以很清晰看到 Object.wait 等待锁有487个线程,正常情况,一个应用如果某时刻的wait等待锁的线程数量大于几十个就大概率说明服务有问题了,更何况这里出现了几百个,很显然是不正常的,于是我们随便找一个wait状态的线程看下详细信息如下。
at com.qcloud.cos.http.IdleConnectionMonitorThread.run(IdleConnectionMonitorThread.java:26)
打开IDA源代码如下。 通过分析,得知在new COSClient()的时候每次new,都会 new 一个IdleConnectionMonitorThread 线程,因此如果使用多例模式每次使用COS Client的时候随着时间的推移就会有大量的空闲线程被创建出来,所以就出现了一开始的问题。UML依赖图如下。

解决方案

1.多例模式
每次创建client之后,在使用结束进行手动显示的shutdown掉Cilent客户端。
2.单例模式
将CosClient 声明到Spring IOC容器中为单利模式,全局使用一个CosClient客户端进行调用。在调用结束之后无需手动进行shutdown调用。例

附件工具

https://download.csdn.net/download/qianyan0365/15419859

相关文章

  • 一次排查Jvm线程飙升问题的经历

    问题发现 通过线上Grafana监控发现某服务 JVM-Thread线程异常高,并且发现每天都在持续飙升,如下。 ...

  • JVM问题排查实战系列

    JVM问题排查实战 记一次频繁FGC的简单排查 一次JVM GC长暂停的排查过程 如何使用MAT进行内存泄露分析

  • 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指...

  • 排查CPU利用率高的线程

    在日常工作中,我们有时候需要排查线上问题,找出系统中CPU利用率最高的线程.当然,我们这里默认被排查的线程在JVM...

  • JVM 问题排查

    CPU使用率高 找出使用率高的进程的pid 找出使用率高的线程tpid 查看使用率高的线程当前在干什么 GC问题 ...

  • JVM问题排查

    一、线上CPU飚高、死锁等排查基本步骤: 1、top 记录CPU使用率最高的JAVA进程PID 2、top -H...

  • JVM问题排查

    一、JVM的参数类型 1.Boolean类型 格式:-XX:[+-]表示启用或者禁用name属性。比如...

  • jvm问题排查

    写在前面 线上系统中:如果突然运行缓慢,CPU 100%,以及Full GC次数过多的问题,最终导致的直观现象就是...

  • jstat、jstack工具初体验

    概要 JVM排查工具的实践 permG与方法区 permG与Metaspace 记第一次使用jvm排查工具实践的过...

  • 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用 arthas 排查jvm中CPU占用过高问题。这工具屌爆了 碾压我目前使用的全部JVM工具。 安装 小...

网友评论

      本文标题:一次排查Jvm线程飙升问题的经历

      本文链接:https://www.haomeiwen.com/subject/dpzhfltx.html