当前位置: 首页 > article >正文

SkyWalking高频采集泄漏线程导致CPU满载排查思路

SkyWalking高频采集泄漏线程导致CPU满载排查思路

契机

最近在消除线上服务告警,发现Java线上测试服经常CPU满载告警,以前都是重启解决,今天好好研究下,打arthas火焰图发现是SkyWalking-agent的线程采集任务一直在吃cpu,jstack一看发现有1w+线程,故使用JProfiler好好排查了下,终于定位到了线程泄漏的原因。

收集线上信息

#找到异常程序,记录pid
top -c#进入arthas,并选择pid
java -jar arthas.jar#arthas控制台打火焰图
[arthas@x]$ profiler start
Profiling started(中间记录个30s)
[arthas@x]$ profiler stop

请添加图片描述

#大概知道线程有问题#查看服务此时线程数
ps -eLf | grep <service_name> | wc -l#dump下线程
jstack <pid> > thread-dump.txt#dump堆栈(对排查用处不大)
jmap -dump:live,format=b,file=/tmp/heap.hprof <pid>

用JProfiler分析hprof

请添加图片描述

可以看到此时确实有1w2的存活线程

请添加图片描述

右键thread,查看是谁持有的thread,发现都是ThreadPoolExecutor基础线程池

请添加图片描述

同样去查看ThreadPoolExecutor的引用,此时发现差不到是谁声明的ThreadPoolExecutor,线索也就断了

分析jstack线程转储

请添加图片描述

使用jstack导出的txt,或者JProfiler的线程转储,信息都一样,发现都不能定位到线程/线程池是哪里来的,但是通过比较发现:线程命名太过于规范pool-367-thread-7,并且后缀不超过10,那么代表一定是我们显示的创建的ThreadPoolExecutor,并且制定了线程数=10。随后在代码中搜索线程池创建:ThreadPoolExecutor,newFixedThreadPool。发现确实有很多地方在声明,但是无法定位到具体代码

请添加图片描述

用JProfiler直接分析线上程序

请添加图片描述

这里需要提前使用命令行链接一下,不然会有known_hosts报错

请添加图片描述

此时在线程monitor里面就可以看到新线程创建的堆栈,马赛克就是我的业务代码

请添加图片描述

分析代码

请添加图片描述

发现是在方法中定义了ThreadPoolExecutor,但是没有调用shutdown方法来正确关闭。导致即使业务方法执行完成后,线程池依然存在,导致线程泄漏。业务中使用全局线程池!

    /*** 重新定义线程名称,方便排查*/private final ThreadFactory namedThreadFactory = new ThreadFactory() {private final AtomicInteger threadNumber = new AtomicInteger(1);private final String namePrefix = "name-Thread-";@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, namePrefix + threadNumber.getAndIncrement());return t;}};private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20, 5L, TimeUnit.MINUTES,new ArrayBlockingQueue<>(100), namedThreadFactory, new ThreadPoolExecutor.CallerRunsPolicy());

无法被回收原因

JAVA// ThreadPoolExecutor内部实现关键代码
private final class Workerextends AbstractQueuedSynchronizerimplements Runnable
{final Thread thread; // 工作线程持有Runnable引用Runnable firstTask;Worker(Runnable firstTask) {this.firstTask = firstTask;this.thread = getThreadFactory().newThread(this);}public void run() {runWorker(this); // 这里会产生循环引用}
}

无法回收的根本原因

  • 每个Worker线程通过thread -> this(Worker实例)-> outerClass(ThreadPoolExecutor)形成引用闭环
  • 即使外部没有引用,只要工作线程存活,就会保持对线程池的强引用

总结

  • JProfiler可以远程分析线上程序
  • 线程池无法被回收的本质原因是其内部的工作线程(Worker)与线程池实例之间的循环强引用,只有当工作线程完全终止(进入TERMINATED状态)且外部没有其他引用时,GC才能回收线程池实例。
  • 应该使用github的动态全局线程池,后续改造吧

写到最后

请添加图片描述

相关文章:

SkyWalking高频采集泄漏线程导致CPU满载排查思路

SkyWalking高频采集泄漏线程导致CPU满载排查思路 契机 最近在消除线上服务告警&#xff0c;发现Java线上测试服经常CPU满载告警&#xff0c;以前都是重启解决&#xff0c;今天好好研究下&#xff0c;打arthas火焰图发现是SkyWalking-agent的线程采集任务一直在吃cpu&#xff…...

【HarmonyOS 5】Map Kit 地图服务之应用内地图加载

#HarmonyOS SDK应用服务&#xff0c;#Map Kit&#xff0c;#应用内地图 目录 前期准备 AGC 平台创建项目并创建APP ID 生成调试证书 生成应用证书 p12 与签名文件 csr 获取 cer 数字证书文件 获取 p7b 证书文件 配置项目签名 配置签名证书指纹 项目开发 配置Client I…...

ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e)

ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e) in ‘/Users/*****/MposApp/MposApp/Modules/Common/Mpos/NewLand/MESDK.framework/MESDK’ clang: error: linker command failed with exit code 1 (use -v to see invocation) 报错 解决方…...

sentinel核心原理-高频问题

核心原理 ‌限流实现机制‌ ‌滑动窗口算法‌&#xff1a;将时间切分为子窗口动态统计QPS&#xff0c;避免固定窗口的边界问题。‌责任链模式‌&#xff1a;通过NodeSelectorSlot、FlowSlot等Slot链式处理限流逻辑。 ‌熔断降级策略‌ ‌慢调用比例‌&#xff1a;当慢请求比例…...

通过vue-pdf和print-js实现PDF和图片在线预览

npm install vue-pdf npm install print-js <template><div><!-- PDF 预览模态框 --><a-modal:visible"showDialog":footer"null"cancel"handleCancel":width"800":maskClosable"true":keyboard"…...

RxJS 核心操作符详细用法示例

1. Observable 详细用法 Observable 是 RxJS 的核心概念&#xff0c;代表一个可观察的数据流。 创建和订阅 Observable import { Observable } from "rxjs";// 1. 创建Observable const myObservable new Observable(subscriber > {// 发出三个值subscriber.n…...

视频监控管理平台EasyCVR结合AI分析技术构建高空抛物智能监控系统,筑牢社区安全防护网

高空抛物严重威胁居民生命安全与公共秩序&#xff0c;传统监管手段存在追责难、威慑弱等问题。本方案基于EasyCVR视频监控与AI视频分析技术&#xff08;智能分析网关&#xff09;&#xff0c;构建高空抛物智能监控系统&#xff0c;实现24小时实时监测、智能识别与精准预警&…...

2.2.1 05年T1复习

引言 从现在进去考研英语基础阶段的进阶&#xff0c;主要任务还是05-09年阅读真题的解题&#xff0c;在本阶段需要注意正确率。阅读最后目标&#xff1a;32-34分&#xff0c;也就是每年真题最多错四个。 做题步骤&#xff1a; 1. 预习&#xff1a;读题干并找关键词 做题&#…...

Python-11(集合)

与字典类似&#xff0c;集合最大的特点就是唯一性。集合中所有的元素都应该是独一无二的&#xff0c;并且也是无序的。 创建集合 使用花括号 set {"python","Java"} print(type(set)) 使用集合推导式 set {s for s in "python"} print(set…...

钉钉开发之AI消息和卡片交互开发文档收集

AI消息和卡片交互开发文档 智能交互接口能力介绍 AI助理发消息&#xff08;主动直接发送模式 AI 助理发消息 - 主动发送模式 AI 助理发消息 - 回复消息模式 AI 助理发消息 - Webhook 回复消息模式 Stream 模式响应卡片回传请求事件 upload-media-files AI 助理发消息&a…...

JMeter 教程:正则表达式提取器提取 JSON 字段数据

目录 JMeter 教程&#xff1a;正则表达式提取器提取 JSON 字段数据【简单实用】 ✅ 目的说明 &#x1f4c4; 示例场景 &#x1f6e0;️ 操作步骤 第一步&#xff1a;发送 HTTP 请求 第二步&#xff1a;添加正则表达式提取器 第三步&#xff1a;使用提取变量 ✅ 正则表达…...

Opixs: Fluxim推出的全新显示仿真模拟软件

Opixs 是 Fluxim 最新研发的显示仿真模拟软件&#xff0c;旨在应对当今显示技术日益复杂的挑战。通过 Opixs&#xff0c;研究人员和工程师可以在制造前&#xff0c;设计并验证 新的像素架构&#xff0c;从而找出更功节能、色彩表现更优的布局方案。 Opixs 适用于学术研究和工业…...

[数据集]无人机视角检测分割数据集合集

数据集名称无人机海洋或河道水上监测检测数据集VOCYOLO格式2903张6类别无人机热红外视角人车检测数据集VOCYOLO格式2866张5类别无人机拍摄红外图像光伏板缺陷检测数据集VOCYOLO格式2723张9类别无人机视角搜索和救援失踪被困人员检测数据集VOCYOLO格式1976张6类别无人机视角垃圾…...

佰力博与您探讨PVDF薄膜极化特性及其影响因素

PVDF&#xff08;聚偏氟乙烯&#xff09;薄膜的极化是其压电性能形成的关键步骤&#xff0c;通过极化处理可以显著提高其压电系数和储能能力。极化过程涉及多种方法和条件&#xff0c;以下从不同角度详细说明PVDF薄膜的极化特性及其影响因素。 1、极化方法 热极化&#xff1a;…...

C++ std::find() 函数全解析

std::find()是C标准库中用于线性查找的基础算法&#xff0c;属于<algorithm>头文件&#xff0c;可应用于任何支持迭代器的容器。 一、函数原型与参数 template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value );​​…...

自动获取ip地址安全吗?如何自动获取ip地址

在数字化网络环境中&#xff0c;IP地址的获取方式直接影响设备连接的便捷性与安全性。自动获取IP地址&#xff08;通过DHCP协议&#xff09;虽简化了配置流程&#xff0c;但其安全性常引发用户疑虑。那么&#xff0c;自动获取IP地址安全吗&#xff1f;如何自动获取IP地址&#…...

STM32:深度解析RS-485总线与SP3485芯片

32个设备 知识点1【RS-485的简介】 RS-485是一种物理层差分总线标准&#xff0c;在串口的基础上演变而来&#xff1b; 两者虽然不在同一层次上直接对等&#xff0c;但在实际系统中&#xff0c;往往使用RS-485驱动差分总线&#xff0c;将USART转换为适合长距离、多点通信的物…...

亚马逊搜索代理: 终极指南

文章目录 前言一、为什么需要代理来搜索亚马逊二、如何选择正确的代理三、搜索亚马逊的最佳代理类型四、为亚马逊搜索设置代理五、常见挑战及克服方法六、亚马逊搜索的替代方法总结 前言 在没有代理的情况下搜索亚马逊会导致 IP 禁止、验证码和速度限制&#xff0c;从而使数据…...

QGraphicsView界面的坑(fitInView()函数没反应)

QGraphicsView本身是特别灵活的一种ui&#xff0c;能够自由响应各种动态操作。不过它最大的问题就是在加载好图像以后&#xff0c;将图像自适应贴合到界面大小的时候&#xff08;fitInView()函数&#xff09;没有反应。 这是因为fitInView函数在执行的时候&#xff0c;需要计算…...

【Python正则表达式终极指南】从零到工程级实战

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

leetcode 算法每日一题 #1

#1 &#xff01; 题目 3355. 零数组变换 I 中等 相关标签 相关企业 提示 给定一个长度为 n 的整数数组 nums 和一个二维数组 queries&#xff0c;其中 queries[i] [li, ri]。对于每个查询 queries[i]&#xff1a;在 nums 的下标范围 [li, ri] 内选择一个下标 子集。 将选中的…...

用matlab提取abaqus odb文件中的节点信息

在MATLAB中提取Abaqus ODB文件中的节点信息&#xff0c;可以通过以下几种方法实现&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以参考这个 MATLAB的ABAQUS Interface工具箱提供了直接读取ODB文件的功能。…...

Spring Bean 注册到容器的方式

Spring Bean 注册到容器的方式主要包括以下几种&#xff1a; 基于 XML 的配置 使用 XML 文件配置 Bean&#xff0c;并定义 Bean 的依赖关系。 基于 Component 注解及其衍生注解 使用注解如 Component、Service、Controller、Repository 等进行配置。 基于 Configuration 和…...

1537. 【中山市第十一届信息学邀请赛决赛】未命名 (noname)

题目描述 这是一个独一无二的世界&#xff0c;所以有 N 张写有互不相同的自然数的卡片&#xff0c;第 i 张卡片写着 Ai &#xff0c;现在你得到了一个未命名的空白卡片&#xff0c;想在上面写上一个自然数 x 满足以下条件&#xff1a; 1.x 不等于任意一张卡片上的数字。 2.x 可…...

数据库三范式详解与应用建议

数据库三范式&#xff08;Normalization&#xff09;是关系型数据库设计的核心原则&#xff0c;旨在减少数据冗余、提高数据一致性&#xff0c;并避免插入、更新和删除异常。以下是三范式的详细说明&#xff1a; 第一范式&#xff08;1NF&#xff09; 核心要求&#xff1a;确保…...

信息学奥赛一本通 1539:简单题 | 洛谷 P5057 [CQOI2006] 简单题

【题目链接】 ybt 1539&#xff1a;简单题 洛谷 P5057 [CQOI2006] 简单题 【题目考点】 1. 树状数组 知识点讲解见&#xff1a;洛谷 P3374 【模板】树状数组 【解题思路】 解法1&#xff1a;树状数组 该有01构成数组初值都为0。 某位置的元素被修改奇数次后值为1&#x…...

C++笔记-封装红黑树实现set和map

1.源码及框架分析 上面就是在stl库中set和map的部分源代码。 通过上图对框架的分析&#xff0c;我们可以看到源码中rb_tree⽤了⼀个巧妙的泛型思想实现&#xff0c;rb_tree是实 现key的搜索场景&#xff0c;还是key/value的搜索场景不是直接写死的&#xff0c;⽽是由第⼆个模板…...

deepseek模拟美团高级java开发工程师面试题

美团高级Java开发工程师面试题及参考答案 一、Java基础部分 1. HashMap实现原理 题目&#xff1a; 请详细描述JDK8中HashMap的实现原理为什么JDK8要将链表转为红黑树&#xff1f;阈值为什么是8&#xff1f;HashMap在多线程环境下会出现什么问题&#xff1f;如何解决&#x…...

留给王小川的时间不多了

王小川&#xff0c;这位头顶“天才少年”光环的清华学霸、搜狗输入法创始人、中国互联网初代技术偶像&#xff0c;正迎来人生中最难啃的硬骨头。 他在2023年创立的百川智能&#xff0c;被称为“大模型六小虎”之一。今年4月&#xff0c;王小川在全员信中罕见地反思过去两年工作…...

回溯算法:解锁多种问题的解决之门

经典回溯算法 回溯算法是一种基于深度优先搜索的算法&#xff0c;通过探索所有可能的候选解来找出所有可能的解。当候选解不满足条件时&#xff0c;会回溯到上一步&#xff0c;尝试其他的候选解。下面将介绍回溯算法在组合问题、切割问题、排列问题、子集问题、棋盘问题和图的…...