记一次 .NET 某低代码开发框架 内存暴涨分析
一背景1. 讲故事微信里有一位朋友找到我说他们公司的程序存在内存暴涨问题自己分析了下没有找到原因让我看下怎么回事由于大家都有dump分析基础所以交流互通上还是很顺利的接下来就是上dump分析啦。二内存暴涨分析1. 为什么会内存暴涨先还是老套路用!address -summary观察下内存分布情况输出如下0:000 !address -summary --- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal Free 363 7dfde87c7000 ( 125.992 TB) 98.43% unknown 9276 201e5858000 ( 2.007 TB) 99.96% 1.57% Heap 65 02547f000 ( 596.496 MB) 0.03% 0.00% Image 1855 009d35000 ( 157.207 MB) 0.01% 0.00% Stack 93 002c00000 ( 44.000 MB) 0.00% 0.00% Other 9 0001de000 ( 1.867 MB) 0.00% 0.00% TEB 31 00003e000 ( 248.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 363 7dfde87c7000 ( 125.992 TB) 98.43% MEM_RESERVE 690 2012b6d4000 ( 2.005 TB) 99.82% 1.57% MEM_COMMIT 10640 0ec155000 ( 3.689 GB) 0.18% 0.00%从卦中可以看到,总计3.6G的总提交内存看样子都落到了Unk区域最好是托管层吃掉了否则就麻烦了接下来使用!dumpheap -stat观察输出如下0:000 !dumpheap -stat Statistics: MT Count TotalSize Class Name ... 0179c7715cb0 1,847,901 451,265,880 Free 7ffc6e0a2888 2 536,870,960 System.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider[] 7ffc6e0a2260 60,873,978 1,460,975,472 System.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider Total 63,333,893 objects, 2,494,520,292 bytes从卦中可以看到程序中有6087w个弱引用接下来使用!dumpheap -mt 7ffc6e0a2260观察下列表详情然后用!gcroot观察其引用根参考如下0:000 !dumpheap -mt 7ffc6e0a2260 Address MT Size 017988001000 7ffc6e0a2260 24 017988001018 7ffc6e0a2260 24 017988001030 7ffc6e0a2260 24 017988001048 7ffc6e0a2260 24 017988001060 7ffc6e0a2260 24 017988001078 7ffc6e0a2260 24 017988001090 7ffc6e0a2260 24 0179880010a8 7ffc6e0a2260 24 ... 017a405f1020 7ffc6e0a2260 24 0:000 !gcroot 0179880010a8 Caching GC roots, this may take a while. Subsequent runs of this command will be faster.等了20多分钟都没有出来结果可能 6kw 的根纵横交错让windbg不堪重负没有就没撤了使用内存搜索法寻找上级所属对象。这里就选择017a405f1020对象来开刀。0:000 !dumpobj /d 17a405f1020 Name: System.WeakReference1[[Microsoft.Extensions.DependencyInjection.ServiceProvider, Microsoft.Extensions.DependencyInjection]][] MethodTable: 00007ffc6e0a2888 EEClass: 00007ffc6dbeb4f8 Tracked Type: false Size: 536870936(0x20000018) bytes Array: Rank 1, Number of elements 67108864, Type CLASS (Print Array) Fields: None 0:000 s-q 0 L?0xffffffffffffffff 17a405f1020 00000179c95861d0 0000017a405f1020 03a0dcfa03a0dcfa 0:000 !lno 0000017a405f1020 Before: 017a405f1000 32 (0x20) Free Current: 017a405f1020 24 (0x18) System.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider[] Error Detected: Object 17a405f1020 has a bad member at offset 12054c00: ??? [verify heap] Could not find object after 17a405f1020 Heap local consistency not confirmed. 0:000 !lno 00000179c95861d0 Before: 0179c95861c8 32 (0x20) System.Collections.Generic.ListSystem.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider Next: 0179c95861e8 24 (0x18) System.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider[] Heap local consistency confirmed. 0:000 !dumpobj /d 179c95861c8 Name: System.Collections.Generic.List1[[System.WeakReference1[[Microsoft.Extensions.DependencyInjection.ServiceProvider, Microsoft.Extensions.DependencyInjection]], System.Private.CoreLib]] MethodTable: 00007ffc6e0a2340 EEClass: 00007ffc6dce0000 Tracked Type: false Size: 32(0x20) bytes File: D:\xxx\A_api\System.Private.CoreLib.dll Fields: MT Field Offset Type VT Attr Value Name 00007ffc6de328f0 400209f 8 System.__Canon[] 0 instance 0000017a405f1020 _items 00007ffc6dc894b0 40020a0 10 System.Int32 1 instance 60873978 _size 00007ffc6dc894b0 40020a1 14 System.Int32 1 instance 60873978 _version 00007ffc6de328f0 40020a2 8 System.__Canon[] 0 staticdynamic statics NYI s_emptyArray 0:000 s-q 0 L?0xffffffffffffffff 179c95861c8 00000179c77571d8 00000179c95861c8 0000000000000000 00000179c95861b8 00000179c95861c8 0800004e00000000 0:000 !lno 00000179c77571d8 Failed to find the segment of the managed heap where the object 179c77571d8 resides 0:000 !lno 00000179c95861b8 Before: 0179c9586108 192 (0xc0) Microsoft.Extensions.DependencyInjection.DependencyInjectionEventSource Next: 0179c95861c8 32 (0x20) System.Collections.Generic.ListSystem.WeakReferenceMicrosoft.Extensions.DependencyInjection.ServiceProvider Heap local consistency confirmed.根据卦中的图和输出终于找到了原来是DependencyInjectionEventSource._providers承担了所有接下来的关注点就来到了DependencyInjectionEventSource。2. xxxEventSource 是什么从名字上看和 ETW 事件有关接下来用!eeversion观察 .net 版本寻找其对应的C#源代码。0:000 !eeversion 6.0.3624.51421 free 6,0,3624,51421 Commit: f1dd57165bfd91875761329ac3a8b17f6606ad18 Workstation mode SOS Version: 9.0.13.2701 retail build从上面的源代码看其实也看不出来个所以毕竟底层的架构我不熟悉本着我不是第一个吃螃蟹的人所以拿关键词在网上索一下果然 stephentoub 大佬在去年4月份就发现了这个问题在 .net10 中做了修复看描述是一个优化级的bug官方链接https://github.com/dotnet/runtime/issues/114599 截图如下修改后的代码如下果然加了很多的业务逻辑来处理。[NonEvent] public void ServiceProviderBuilt(ServiceProvider provider) { lock (_providers) { int providersCount _providers.Count; if (providersCount 0 (_survivingProvidersCount isint spc ? (uint)providersCount 2 * (uint)spc : providersCount _providers.Capacity)) { _providers.RemoveAll(static p !p.TryGetTarget(out _)); _survivingProvidersCount _providers.Count; } _providers.Add(new WeakReferenceServiceProvider(provider)); } WriteServiceProviderBuilt(provider); }从官方描述来看就是有人创建了 scope但后续没有调用 dispose 方法来及时释放导致框架中的 WeakReference 引用滞留引发内存暴涨可以说两者都有责任吧。解决办法很简单两种方式检查代码里写 BuildServiceProvider 的地方没有即时的 Dispose。升级到 .NET10 这是最简单粗暴的方法。把结论告诉朋友后朋友终于在2天后给我反馈了好消息好心情溢于言表三总结dump之旅是一个修理工不断自我修炼的过程必须学会在绝望中寻找希望的能力。

相关新闻

03 别再用 CGLIB 了!深度解析 Byte Buddy:为什么它是现代 Java 框架的首选?

03 别再用 CGLIB 了!深度解析 Byte Buddy:为什么它是现代 Java 框架的首选?

摘要:在 Java 生态中,动态代理和代码生成是 Spring、Hibernate、Mockito 等顶级框架的基石。然而,许多开发者仍在使用老旧的 CGLIB 或受限的 JDK Proxy。本文将深入剖析 Byte Buddy 的设计哲学,通过性能基准测试和实战案例&#x…

2026/7/4 7:36:47 阅读更多 →
Flutter 三方库 super_log 的鸿蒙化适配指南 - 实现极具视觉冲击力的彩色终端日志、支持动态过滤与全局异常捕获

Flutter 三方库 super_log 的鸿蒙化适配指南 - 实现极具视觉冲击力的彩色终端日志、支持动态过滤与全局异常捕获

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net Flutter 三方库 super_log 的鸿蒙化适配指南 - 实现极具视觉冲击力的彩色终端日志、支持动态过滤与全局异常捕获 前言 在进行 Flutter for OpenHarmony 的日常开发调试时,面对…

2026/7/3 14:43:00 阅读更多 →
豆包 vs OpenClaw:智能体的本质区别与安全风险分析

豆包 vs OpenClaw:智能体的本质区别与安全风险分析

从代理模式到安全边界,一文读懂两种智能体的核心差异引言:两种不同的"代理"模式 近年来,AI智能体(Agent)技术快速发展,各类智能体产品层出不穷。其中,豆包和OpenClaw是两种具有代表性…

2026/7/3 6:07:30 阅读更多 →

最新新闻

TB9051FTG与PIC18F67K40实现直流电机静音驱动方案

TB9051FTG与PIC18F67K40实现直流电机静音驱动方案

1. 项目背景与核心挑战直流电机在工业自动化、消费电子和机器人领域的应用越来越广泛,但传统驱动方案存在明显的噪声问题。这种噪声主要来源于两个方面:PWM开关频率引起的电磁噪声,以及电机换向时电流突变产生的机械振动。TB9051FTG这款H桥驱…

2026/7/5 0:48:00 阅读更多 →
终极解决方案:用ChromaControl实现所有RGB设备在雷蛇生态中的完美同步

终极解决方案:用ChromaControl实现所有RGB设备在雷蛇生态中的完美同步

终极解决方案:用ChromaControl实现所有RGB设备在雷蛇生态中的完美同步 【免费下载链接】ChromaControl 3rd party device lighting support for Razer Synapse. 项目地址: https://gitcode.com/gh_mirrors/ch/ChromaControl 还在为桌面上不同品牌的RGB设备各…

2026/7/5 0:45:59 阅读更多 →
Ceph自动化运维开发:openeuler/ceph_dev中Ansible与Terraform集成

Ceph自动化运维开发:openeuler/ceph_dev中Ansible与Terraform集成

Ceph自动化运维开发:openeuler/ceph_dev中Ansible与Terraform集成 【免费下载链接】ceph_dev ceph_dev is a project focus on some feature developing based on ceph 项目地址: https://gitcode.com/openeuler/ceph_dev 前往项目官网免费下载:h…

2026/7/5 0:43:58 阅读更多 →
【Springboot毕设全套源码+文档】基于springboot二次元商品商城系统的设计与实现(丰富项目+远程调试+讲解+定制)

【Springboot毕设全套源码+文档】基于springboot二次元商品商城系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 0:43:58 阅读更多 →
告别Selenium弹窗噩梦:Playwright实现无头浏览器文件自动下载实战

告别Selenium弹窗噩梦:Playwright实现无头浏览器文件自动下载实战

1. 项目概述:为什么我们要告别Selenium?如果你做过Web自动化测试或者数据抓取,尤其是涉及到文件下载的场景,那你大概率经历过“弹窗噩梦”。浏览器原生的“另存为”对话框,就像一堵无法逾越的高墙,横亘在你…

2026/7/5 0:39:55 阅读更多 →
从光学到产品:护眼钢化膜的技术原理与实现路径深度解析(以悟赫德 scinique 技术为例)

从光学到产品:护眼钢化膜的技术原理与实现路径深度解析(以悟赫德 scinique 技术为例)

1. 引言:为什么我们需要 "护眼" 的手机膜?随着 OLED 屏幕在智能手机中的全面普及,以及用户日均用屏时长的不断增加(据统计,2026 年国内用户日均手机使用时长已超过 6.5 小时),视疲劳正…

2026/7/5 0:39:55 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻