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

记一次 .NET 某集群管理软件 内存暴涨分析

一背景1. 讲故事前些天有位朋友微信找到我说它的程序出现了内存暴涨自己也没分析出啥让我看下到底怎么回事然后让这位朋友抓一个dump拿它占一卦就行了。二内存暴涨分析1. 为什么会暴涨到底是哪里的暴涨折半查找一下就知道了分别通过!address -summary和!eeheap -gc观察各自的内存输出如下0:000 !eeheap -gc DATAS Number of GC Heaps: 1 ---------------------------------------- generation 0 starts at 2e8fc4b9da8 generation 1 starts at 2e8fc4b99a0 generation 2 starts at 2e780001000 ephemeral segment allocation context: none Small object heap segment begin allocated committed allocated size committed size 02e780000000 02e780001000 02e78fffffd0 02e790000000 0xfffefd0 (268431312) 0x10000000 (268435456) ... 02e8b8150000 02e8b8151000 02e8c814ff58 02e8c8150000 0xfffef58 (268431192) 0x10000000 (268435456) 02e8e0150000 02e8e0151000 02e8f014ff90 02e8f0150000 0xfffef90 (268431248) 0x10000000 (268435456) 02ec45c40000 02ec45c41000 02ec55c3fe90 02ec55c40000 0xfffee90 (268430992) 0x10000000 (268435456) 02e8f0150000 02e8f0151000 02e8fc865dc0 02e8fce40000 0xc714dc0 (208752064) 0xccf0000 (214892544) Large object heap starts at 2e790001000 segment begin allocated committed allocated size committed size 02e790000000 02e790001000 02e7960253a0 02e796046000 0x60243a0 (100811680) 0x6046000 (100950016) 02e7a29d0000 02e7a29d1000 02e7a47242e8 02e7a4745000 0x1d532e8 (30749416) 0x1d75000 (30887936) 02e8c8150000 02e8c8151000 02e8dcae0b50 02e8dcae1000 0x1498fb50 (345570128) 0x14991000 (345575424) Pinned object heap starts at 2e798001000 segment begin allocated committed allocated size committed size 02e798000000 02e798001000 02e79806d3f0 02e79806e000 0x6c3f0 (443376) 0x6e000 (450560) ------------------------------ GC Allocated Heap Size: Size: 0x128e77b30 (4981226288) bytes. GC Committed Heap Size: Size: 0x1294aa000 (4987723776) bytes.从卦中看很显然这是一个托管内存暴涨问题接下来怎么办呢看看托管堆都有哪些对象来进一步的drill down, 接下来使用!dumpheap -stat分析托管堆详情输出如下0:000 !address -summary --- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal Free 934 7dfd28767000 ( 125.989 TB) 98.43% unknown 2136 2026b0c5000 ( 2.009 TB) 99.92% 1.57% Heap 104 04fac0000 ( 1.245 GB) 0.06% 0.00% Image 1343 015f8a000 ( 351.539 MB) 0.02% 0.00% Stack 219 006b00000 ( 107.000 MB) 0.01% 0.00% Other 16 0001e7000 ( 1.902 MB) 0.00% 0.00% TEB 73 000092000 ( 584.000 kB) 0.00% 0.00% PEB 1 000001000 ( 4.000 kB) 0.00% 0.00% --- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal MEM_FREE 934 7dfd28767000 ( 125.989 TB) 98.43% MEM_RESERVE 529 20132f63000 ( 2.005 TB) 99.68% 1.57% MEM_COMMIT 3363 1a4926000 ( 6.571 GB) 0.32% 0.01% 0:000 !dumpheap -stat Statistics: MT Count TotalSize Class Name ... 7fff3d73b460 135,722 60,558,432 System.Windows.EffectiveValueEntry[] 7fff3d495b58 6,933,877 166,413,048 System.WeakReference 7fff3df42c28 6,737,027 323,377,296 MS.Internal.Data.DataBindEngineTask 7fff3d46c878 1,719 347,902,656 System.Collections.Hashtablebucket[] 7fff3df40c18 6,749,752 971,964,28 8 System.Windows.Data.BindingExpression 02e7e69b9b80 5,342,750 2,859,160,528 Free Total 28,339,839 objects, 4,980,676,386 bytes这幅卦有意思Free占大头这也就表明当前托管堆存在碎片化有些朋友可能比较好奇这碎片化到底是怎么个碎片化能不能给我看看涨什么样子这个就需要使用 jetbrains 大名鼎鼎的 DotMemory 了。从卦中可以看到 Gen2 上有大量的灰色小段丛横交错这就是内部的free撑起来的虚幻内存到这里我们已然知道内存暴涨和Free有密切的关系。2. 为啥有那么多的free要想找到这个问题的答案就需要看下 free 的前后都是什么对象了这里我就随便截取一段参考如下0:000 !dumpheap 02e8e0151000 02e8f014ff90 Address MT Size 02e8e09da8f0 02e7e69b9b80 872 Free 02e8e09dac58 7fff3df40c18 144 02e8e09dace8 7fff3d495b58 24 02e8e09dad00 7fff3df42c28 48 02e8e09dad30 02e7e69b9b80 1,000 Free 02e8e09db118 7fff3df40c18 144 02e8e09db1a8 7fff3d495b58 24 02e8e09db1c0 7fff3df42c28 48 02e8e09db1f0 02e7e69b9b80 656 Free 02e8e09db480 7fff3df40c18 144 02e8e09db510 7fff3d495b58 24 02e8e09db528 7fff3df42c28 48 02e8e09db558 02e7e69b9b80 760 Free 02e8e09db850 7fff3df40c18 144 02e8e09db8e0 7fff3d495b58 24 02e8e09db8f8 7fff3df42c28 48 02e8e09db928 02e7e69b9b80 608 Free 02e8e09dbb88 7fff3df40c18 144 02e8e09dbc18 7fff3d495b58 24 02e8e09dbc30 7fff3df42c28 48 02e8e09dbc60 02e7e69b9b80 480 Free 02e8e09dbe40 7fff3df40c18 144 02e8e09dbed0 7fff3d495b58 24 02e8e09dbee8 7fff3df42c28 48 02e8e09dbf18 02e7e69b9b80 656 Free从卦中的对象分布来看layout还是蛮有规律的这里就从02e8e09dbb88这个地址上开刀吧使用!gcroot观察。0:000 !gcroot 02e8e09dbb88 Caching GC roots, this may take a while. Subsequent runs of this command will be faster. HandleTable: 000002e7e68d1340 (strong handle) - 02e780019858 System.Object[] - 02e780019588 System.Windows.Threading.Dispatcher - 02e7800196c0 System.Windows.Threading.PriorityQueueSystem.Windows.Threading.DispatcherOperation - 02e8fc49c608 System.Windows.Threading.PriorityItemSystem.Windows.Threading.DispatcherOperation - 02e8fc4a5c10 System.Windows.Threading.PriorityItemSystem.Windows.Threading.DispatcherOperation - 02e8fc4a3d00 System.Windows.Threading.PriorityItemSystem.Windows.Threading.DispatcherOperation - 02e8fc4a3bd8 System.Windows.Threading.DispatcherOperation - 02e8fc4a3b98 System.Action - 02e8fc492380 xxx.UiViewModelBasec__DisplayClass375_0 - 02e780ed3ea0 xxx.xxx.EFEMViewModel - 02e780ed4518 System.Collections.ObjectModel.ObservableCollectionSystem.String - 02e781581de0 System.Collections.Specialized.NotifyCollectionChangedEventHandler - 02e781581c48 System.Windows.Data.ListCollectionView - 02e7804095d8 MS.Internal.Data.DataBindEngine - 02e780409a70 System.Collections.Specialized.HybridDictionary - 02e7869fa948 System.Collections.Hashtable - 02e8c8151020 System.Collections.Hashtablebucket[] - 02e8e09dbb88 System.Windows.Data.BindingExpression揽天地入卦中我们看到了熟悉的Dispatcher这不就是消息循环的调度器嘛接下来赶紧看看内部的 PriorityQueue 集合截图如下尼玛居然积压了 8949 个未处理导致gen2直接碎片化说实话这个 lead to 我还是第一次见到以前最多导致 UI 卡慢甚至卡死害我也是长见识了。3. 都是谁在疯狂的推送要想找到这块信息可以观察下各个线程都在做什么看看那些 suspicious 线程都在通过什么进行Invoke输出和截图如下0:000 ~*e !clrstack OS Thread Id: 0x4060 (22) Child SP IP Call Site 000000F80A67EBD8 00007fffb316e0f4 [HelperMethodFrame: 000000f80a67ebd8] System.Threading.WaitHandle.WaitOneCore(IntPtr, Int32) 000000F80A67ECE0 00007fff3e830687 System.Threading.WaitHandle.WaitOneNoCheck(Int32) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/WaitHandle.cs 139] 000000F80A67ED40 00007fff3e91e335 System.Windows.Threading.DispatcherOperationDispatcherOperationEvent.WaitOne() [/_/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs 659] 000000F80A67EDB0 00007fff3e912dd3 System.Windows.Threading.DispatcherOperation.Wait(System.TimeSpan) [/_/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/DispatcherOperation.cs 220] 000000F80A67EDF0 00007fff3e91ddb7 System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherOperation, System.Threading.CancellationToken, System.TimeSpan) [/_/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/Dispatcher.cs 1384] 000000F80A67EE80 00007fff3e91da7e System.Windows.Threading.Dispatcher.Invoke(System.Action, System.Windows.Threading.DispatcherPriority, System.Threading.CancellationToken, System.TimeSpan) [/_/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/Dispatcher.cs 627] 000000F80A67EF00 00007fff3e91d7f5 System.Windows.Threading.Dispatcher.Invoke(System.Action) [/_/src/Microsoft.DotNet.Wpf/src/WindowsBase/System/Windows/Threading/Dispatcher.cs 509] 000000F80A67EF40 00007fff3ebe6acd xxx.UiViewModelBase.GetDataAndUpdate(System.Collections.Generic.IEnumerable1System.String) 000000F80A67F0A0 00007fff3ebe54ff xxx.UiViewModelBase.Poll() 000000F80A67F310 00007fff3e1253a7 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs 183] 000000F80A67F380 00007fff3e906d7e System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs 2333] 000000F80A67F430 00007fff9c48b32a System.Threading.Tasks.ThreadPoolTaskSchedulerc..cctorb__10_0(System.Object) [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/ThreadPoolTaskScheduler.cs 35] 000000F80A67F460 00007fff9c461d41 System.Threading.Thread.StartCallback() [/_/src/coreclr/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs 105] 000000F80A67F6F0 00007fff9cd1a573 [DebuggerU2MCatchHandlerFrame: 000000f80a67f6f0]最后的作业就留给这位朋友了优化代码逻辑将 PriorityQueue 给降下去当然原则上来说朋友没有反馈卡死可能它这个程序是无人值守的所以不知道UI线程的惨样。三总结这次生产事故的分析给我的dump分析之旅增加了一点点缀毕竟也给我涨了点见识期待下次精彩相遇。

相关文章:

记一次 .NET 某集群管理软件 内存暴涨分析

一:背景 1. 讲故事 前些天有位朋友微信找到我,说它的程序出现了内存暴涨,自己也没分析出啥,让我看下到底怎么回事,然后让这位朋友抓一个dump,拿它占一卦就行了。 二:内存暴涨分析 1. 为什么会暴…...

容器资源限制

1、创建一个临时容器c1 docker run -it --namec1 --rm centos:v1监控容器的资源使用情况 docker statsmemload工具可以直接占用消耗资源 将memload工具拷贝到c1容器的opt目录下 docker cp memload-7.0-1.r29766.x86_64.rpm c1:/opt在运行的容器中安装上传的安装包 rpm -ivh /op…...

收藏!小白程序员必看:搞定RAG知识库,解锁大模型核心技能!

文章强调知识库是RAG系统的核心,其质量直接影响智能问答效果。构建知识库并非简单处理数据,而是涉及多数据源整合、复杂格式处理、数据更新与版本管理、文档召回优化及系统架构设计等关键环节。作者指出,随着数据量增长,完善的知识…...

原神抽卡数据分析终极指南:免费开源工具助你告别抽卡迷茫

原神抽卡数据分析终极指南:免费开源工具助你告别抽卡迷茫 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 还在为原神抽卡记录无法保存而烦恼吗…...

收藏!揭秘高薪职业:AI大模型训练师,小白也能入门的AI时代新机遇!

本文介绍了AI大模型训练师这一新兴职业,旨在解决AI与人类沟通的障碍。训练师通过拆解人类模糊需求,教AI识别信号,输出精准回应。随着AI技术普及,该岗位需求激增,薪资可达3w。工作内容包括数据管理、模型训练、评估迭代…...

原神祈愿数据分析终极方案:genshin-wish-export架构革命与效能倍增

原神祈愿数据分析终极方案:genshin-wish-export架构革命与效能倍增 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你是否曾在多设备间苦苦同…...

打开U盘文件夹变成.exe的问题:在MAC ios中的解决办法

Mac文件夹变成.exe文件,通常是由于病毒将原文件夹隐藏并生成同名exe文件所致。 此类情况多发生于Mac移动硬盘或U盘在Windows系统感染病毒后,病毒会隐藏原始文件夹,并生成伪装成文件夹的exe文件。由于Mac系统默认不显示文件扩展名&#xff0c…...

SHE 密钥注入的“通配符魔法”:从 UID 通配到 AUTOSAR 分层落地

想象一下,你是一家汽车电子工厂的技术员,需要为成千上万个 ECU 刷写密钥。每个 ECU 都有一个独一无二的 ID(UID)。如果每次刷写都要读取这个 UID,再根据 UID 计算出专属的密钥数据,那产线的效率会大打折扣。…...

告别检测卡点,okbiye 智能双优化破解毕业论文查重与 AI 识别难题

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 一、引言:论文定稿阶段两大检测难题普遍困扰学子 论文撰写收尾阶段,绝大多数毕业生都会直面两道审核关卡&#x…...

Image2.0生成的PPT图片转换成可编辑的PPT的一种方法

老弟,PPT不想做,用AI生成的PPT图片编辑不了很烦恼是吧,俺有一法!~ Edit Banana(最强,开源免费) 能把 AI 图→可编辑 PPTX / DrawIO / SVG 原理:用 SAM 分割图标 / 形状,用…...

全球眼用缓释药市场调查:预计2032年将攀升至25.46亿美元

在全球人口老龄化加速与慢性眼病患病率持续攀升的背景下,眼用缓释药市场正迎来历史性增长窗口。据QYResearch(北京恒州博智国际信息咨询有限公司)最新统计,2025年全球眼用缓释药市场销售额已达15.00亿美元,预计2032年将…...

用 MinIO 搭建 S3 兼容对象存储服务

用 MinIO 搭建 S3 兼容对象存储服务 分类:开源项目部署 MinIO 适合附件、备份归档和 S3 兼容对象文件。这类主题真正跑起来并不难,难的是上线后稳定、可备份、能排错。本文按实操方式整理一套可以直接落地的流程,默认你已经会登录 Linux 服务…...

GEO生成引擎优化:当品牌竞争从搜索结果页迁移到大模型对话窗口

当生成式AI成为信息的首要分发渠道,你的品牌还只盯着SEO吗?一、用户获取信息的路径,已经变了过去十几年,我们习惯了"搜索关键词 → 浏览结果页 → 点击进入网站"这条线性路径。SEO(搜索引擎优化)…...

Perplexity案例法检索深度解析(工业级RAG系统落地避坑手册)

更多请点击: https://intelliparadigm.com 第一章:Perplexity案例法检索深度解析(工业级RAG系统落地避坑手册) Perplexity作为衡量语言模型预测不确定性的核心指标,在RAG系统中并非仅用于后处理重排序,而是…...

从OpenAPI 3.1规范到实时交互式文档:ChatGPT驱动的API文档生成闭环体系(含性能压测数据对比)

更多请点击: https://kaifayun.com 第一章:从OpenAPI 3.1规范到实时交互式文档:ChatGPT驱动的API文档生成闭环体系(含性能压测数据对比) OpenAPI 3.1 是首个原生支持 JSON Schema 2020-12 的 API 描述标准&#xff0c…...

2026线下全网营销课程5大甄选:高适配内容改善品牌转化低迷现状

引文/摘要把流量费花在无效投放上,不如先从内部梳理内容适配度。2026年全网营销进入新阶段,据调研超过78%的营销团队已将AI工具纳入日常工作流。然而很多企业面临“内容做了不少,转化却上不去”的尴尬。本质问题往往不是内容不够多&#xff0…...

气动黄油机核心技术解析:泵的选择与厂家评估方法论

工业黄油就是润滑脂,属于半固体润滑剂,润滑脂的作用主要是润滑、保护和密封。可以有效降低机械摩擦,防止磨损,同时还能防腐蚀及密封防尘。毫不夸张的说,润滑脂就是万金油,黄油加注机广泛应用于汽车制造业、…...

量子优化算法ITEMC:原理、实现与应用

1. 量子优化算法ITEMC的核心原理量子优化算法ITEMC(Imaginary Time Evolution Mimicking Circuit)是一种创新的混合量子-经典算法,专门用于解决二次无约束二进制优化(QUBO)问题。其核心思想源自量子力学中的虚时间演化…...

QQ空间说说备份终极指南:GetQzonehistory完整教程

QQ空间说说备份终极指南:GetQzonehistory完整教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经想要永久保存QQ空间里那些珍贵的青春回忆?那些承载着…...

VMware虚拟机创建详细教程(新手小白友好)

本教程以 VMware Workstation Pro 16/17 版本为例,演示如何创建一台新的虚拟机。第一步:启动新建虚拟机向导打开VMware Workstation,点击主界面上的 “创建新的虚拟机”,或依次点击菜单栏“文件” → “新建虚拟机”。图1 VMware创…...

Photoshop‌2022安装教程

ps是一款使用率很高的设计工具,此篇分享一下Windows2022版本的安装教程 1、下载的压缩包解压2、右键以管理员身份运行Set-up.exe3、选择语言及安装位置(建议安装在系统盘C以外的其他磁盘)4、继续安装,等待安装完成点击关闭即可5、…...

Vue/React/Svelte通用Lovable实践框架(内部首发):1套配置+4个插件=自动注入用户喜爱度

更多请点击: https://kaifayun.com 第一章:Vue/React/Svelte通用Lovable实践框架(内部首发):1套配置4个插件自动注入用户喜爱度 Lovable 是一套面向用户体验(UX)可量化提升的前端工程化实践框架…...

Cortex-M0+与M3/M4的SWD调试接口整合方案

1. Cortex-M0与Cortex-M3/M4的SWD调试接口整合挑战在嵌入式系统设计中,经常需要将不同性能等级的ARM Cortex-M系列处理器组合使用。比如将低功耗的Cortex-M0与高性能的Cortex-M3/M4搭配,形成主从处理器架构。这种组合在物联网终端、工业控制器等场景非常…...

量子计算在DNA序列相似性比较中的应用与优化

1. 量子计算与DNA序列相似性比较的背景DNA序列相似性比较是生物信息学和比较基因组学中的基础性任务。想象一下,你手上有两串由A、T、G、C四个字母组成的长字符串,如何判断它们的相似程度?这个问题看似简单,但在实际应用中却极具挑…...

量子PSO与机器学习在天线小型化设计中的应用

1. 量子PSO与机器学习在天线小型化设计中的革命性应用作为一名长期从事射频工程和天线设计的从业者,我见证了传统设计方法从纯手工计算到计算机辅助设计的演进。但直到接触量子粒子群优化(QDPSO)与机器学习的融合应用,才真正体会到智能化设计带来的效率飞…...

C251编译器变量声明顺序与内存空间指定符详解

1. C251编译器变量声明语法错误解析最近在将8051代码移植到251平台时,遇到一个看似简单却令人困惑的编译错误。当我使用const code int x;这样的变量声明方式时,C251编译器报出了"Error 25: syntax error near int"的错误。这个错误信息看起来…...

深入理解关系数据库三范式

一、范式化设计的意义非规范化的数据库可能导致:数据冗余:相同数据在多处重复存储(如用户姓名在订单表、日志表重复出现)更新异常:修改一处数据需同步更新多处,易遗漏引发数据不一致插入/删除异常&#xff…...

graph-autofusion:算子自动融合框架,让模型性能提升30%

前言 算子融合就像把多个快递包裹合并成一个,减少送货次数。 你有没有想过,为什么模型推理时,每个算子都要单独读写HBM(High Bandwidth Memory)?明明LayerNorm后面紧跟Add,为什么要分开算&#…...

浮动油封市场深度研判:预计2032年将攀升至4.57亿美元

浮动油封,也叫机械端面密封或永久密封,是一种特殊类型的机械密封,主要由一对耐磨的金属浮封环和配套的橡胶密封圈组成,它通过橡胶圈的弹力使两个金属环端面紧密贴合、相对滑动,实现对油、水、泥沙等介质的动态密封&…...

2026年ERP+分销一体化还是独立部署?两种架构的优劣对比与选型建议

分销ERP的选型是一个典型的“三年决策”——今天选了什么,未来三年就要和它绑定。选小了,业务一扩张系统就撑不住;选大了,为用不上的功能付了高昂成本。更棘手的困境是“换系统”——已经跑了好几年的业务数据和流程,迁…...