记一次 .NET 某智慧医保云服务Linux 非托管泄露分析
一背景讲故事说来也奇怪最近分析了好几例内存暴涨事故这不又来了哈哈今天再给大家带来一份非托管内存泄露导致的程序生产故障而且是部署在Linux上.NET程序。前些天有位朋友找到我自己有一定的分析能力发现程序是非托管内存泄露但能力有限暂时也不知道怎么弄让我帮忙看下把dump也丢给我了既然dump有了那就开始分析吧。二内存暴涨分析为什么会暴涨虽然朋友说了是非托管内存泄露但我们还是要相信数据使用 !maddress 观察即可。0:000 !maddress±------------------------------------------------------------------------| Memory Type | Count | Size | Size (bytes) |±------------------------------------------------------------------------| PAGE_READWRITE | 2,465 | 3.64gb | 3,913,596,928 || GCHeap | 9 | 1.45gb | 1,557,557,248 || Stack | 63 | 972.26mb | 1,019,490,304 || Image | 1,413 | 287.81mb | 301,786,112 || HighFrequencyHeap | 1,722 | 107.54mb | 112,758,784 || LowFrequencyHeap | 903 | 66.32mb | 69,545,984 || LoaderCodeHeap | 35 | 61.00mb | 63,963,136 || HostCodeHeap | 85 | 19.97mb | 20,942,848 || ResolveHeap | 3 | 1.09mb | 1,142,784 || IndirectionCellHeap | 9 | 536.00kb | 548,864 || StubHeap | 8 | 460.00kb | 471,040 || DispatchHeap | 2 | 452.00kb | 462,848 || CacheEntryHeap | 7 | 420.00kb | 430,080 || LookupHeap | 5 | 272.00kb | 278,528 || PAGE_READONLY | 125 | 263.00kb | 269,312 || PAGE_EXECUTE_WRITECOPY | 6 | 232.00kb | 237,568 || PAGE_EXECUTE_READ | 2 | 8.00kb | 8,192 |±------------------------------------------------------------------------| [TOTAL] | 6,862 | 6.58gb | 7,063,490,560 |±------------------------------------------------------------------------从卦中我们看到程序总计吃了 6.58G 内存其中 PAGE_READWRITE 3.64G很显然这是赤裸裸的非托管内存泄露说实话Linux上的非托管内存泄露不是很好弄接下来我们的研究方向在哪里呢在如今AI横行的时代可以用一个小技巧那就是用AI将 2465个 PAGE_READWRITE 做一个 groupby 操作寻找size的特征这里取 top5 的记录截图如下image从卦中可以清晰的看到主体上是被 50~200MB 这个区间吃掉了接下来我们随便挑选几个观察其中内容截图如下image从卦中可以看到大量的 lambda_methodxxx 的字样看起来和动态代码生成有关系但还不是那么清晰。lambda_method 为啥这么多不管怎么说数字这么大了冥冥之中应该是一种失控熟悉C# 的朋友应该知道这个应该是 C# 通过 DynamicMethod 类似的机制动态生成的方法所以我们的接下来的注意力应该投向托管堆了使用 !dumpheap -stat 观察托管堆。0:000 !dumpheap -stat…7f6cee5e6360 105,288 10,949,952 System.Reflection.RuntimeMethodInfo7f6cf0943da8 81,261 11,701,584 System.Reflection.Emit.DynamicILGenerator7f6cfc273e40 1,428 11,732,448 IndexItem[]7f6cf883b510 13,189 12,785,440 System.Collections.Concurrent.ConcurrentDictionarySystem.String, System.ObjectNode[]7f6cf9c3aaa0 132,063 13,734,552 OracleInternal.Common.ColumnDescribeInfo7f6cfa1f54b0 20,424 16,314,756 Oracle.ManagedDataAccess.Client.OracleParameterStatus[]7f6cf97f7cb8 55,844 28,145,376 Oracle.ManagedDataAccess.Client.OracleConnection7f6ceed94548 21,310 32,195,096 System.Byte[][]7f6cedb852a8 1,445,516 34,692,384 System.Object7f6cff21ea98 728,162 40,777,072 SkiaSharp.SKString7f6cf561ca90 1,343,650 42,996,800 Microsoft.Win32.SafeHandles.SafeEvpCipherCtxHandle7f6cedb8b110 144,685 54,552,728 System.Object[]7f6cf0cd1110 1,878,511 60,112,352 Microsoft.Win32.SafeHandles.SafeWaitHandle55ad23d21ab0 58,648 70,742,904 Free7f6cedc38080 141,177 100,202,360 System.Int32[]7f6cedc3d2e0 2,827,739 188,196,546 System.String7f6cee5ea3a0 3,787,714 280,567,631 System.Byte[]Total 18,171,140 objects, 1,533,484,720 bytesFragmented blocks larger than 0.5 MB:Address Size Followed By7f6a1d47cb18 3,359,344 7f6a1d7b0d88 System.Byte[]7f6a1d81c080 1,151,408 7f6a1d935230 System.IO.Compression.ZLibNativeZLibStreamHandle看到卦中的 DynamicILGenerator10.5w 的时候猜想再次被印证看样子非托管内存中都是它投放的接下来观察 DynamicILGenerator 的引用根看看到底咋回事。0:000 !dumpheap -mt 7f6cf0943da8Address MT Size…7f6cc7f7a3f0 7f6cf0943da8 1447f6cc7f81168 7f6cf0943da8 1447f6cc7f81598 7f6cf0943da8 1447f6cc7f81988 7f6cf0943da8 1447f6cc7f83308 7f6cf0943da8 1447f6cc7f83ff8 7f6cf0943da8 1447f6cc7f8ceb8 7f6cf0943da8 144Statistics:MT Count TotalSize Class Name7f6cf0943da8 81,261 11,701,584 System.Reflection.Emit.DynamicILGeneratorTotal 81,261 objects, 11,701,584 bytes0:000 !gcroot 7f6cc7f7a3f0Found 0 unique roots.0:000 !gcroot 7f6b67d00990Found 0 unique roots.0:000 !gcroot 7f6cc7f83ff8Found 0 unique roots.从卦中看比较奇怪的是为什么这几个 DynamicILGenerator 样本都没有引用根呢这里又藏了什么玄机呢DynamicILGenerator为什么无引用根如果你有大量的dump分析经验我相信你马上就会想到一个东西对它就是 finalizequeue因为有析构但未被回收自然就想到了它输出如下0:000 !fq -statSyncBlocks to be cleaned up: 0Free-Threaded Interfaces to be released: 0MTA Interfaces to be released: 0STA Interfaces to be released: 0Heap 0generation 0 has 25 objects (7f6b29d58238-7f6b29d58300)generation 1 has 90,693 objects (7f6b29ca7010-7f6b29d58238)generation 2 has 0 objects (7f6b29ca7010-7f6b29ca7010)Ready for finalization 4,088,657 objects (7f6b29d58488-7f6b2bc89f10)Statistics for all finalizable objects (including all objects ready for finalization):这一卦真的太灵验了从尼玛 Ready for finalization 4,088,657 objects 中发现有 408w 的对象在freachable中等待释放看样子FinalizerThread 有点麻烦了。FinalizerThread 怎么了不管怎么说直觉告诉我马上就要真相大白了有点抑制不住内心的喜悦接下来切过去观察 FinalizerThread 的调用栈输出如下0:000 ~~[11d83]slibpthread_2_170xbde2:00007f6d6816ede2 4989c6 mov r14,rax0:005 kChild-SP RetAddr Call Site00 00007f6d644892e0 00007f6d67143fd6 libpthread_2_170xbde201 00007f6d64489330 00007f6d67143ca1 libcoreclr!CorUnix::CPalSynchronizationManager::ThreadNativeWait0x126 [/__w/1/s/src/coreclr/pal/src/synchmgr/synchmanager.cpp 488]02 00007f6d64489390 00007f6d67148e39 libcoreclr!CorUnix::CPalSynchronizationManager::BlockThread0x1d1 [/__w/1/s/src/coreclr/pal/src/synchmgr/synchmanager.cpp 307]03 (Inline Function) ---------------- libcoreclr!CorUnix::InternalSleepEx0x61 [/__w/1/s/src/coreclr/pal/src/synchmgr/wait.cpp 850] 04 00007f6d644893f0 00007f6d66db49f7 libcoreclr!SleepEx0x99 [/__w/1/s/src/coreclr/pal/src/synchmgr/wait.cpp 285] 05 00007f6d64489440 00007f6d66e0c53b libcoreclr!Thread::UserSleep0x147 [/__w/1/s/src/coreclr/vm/threads.cpp 4264] 06 00007f6d64489490 00007f6cfbde865a libcoreclr!ThreadNative::Sleep0xbb [/__w/1/s/src/coreclr/vm/comsynchronizable.cpp 471] 07 00007f6d644895f0 00007f6cfea03c0b System_Private_CoreLib!System.Threading.Thread.Sleep0x1a [/_/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs 357] 08 00007f6d64489620 00007f6cfea03ac9 xxxx_7f6cb4034000! 09 00007f6d64489660 00007f6d66fbc277 xxxx_7f6cb4034000! 0a 00007f6d64489700 00007f6d66df1dee libcoreclr!CallDescrWorkerInternal0x7c [/__w/1/s/src/coreclr/pal/inc/unixasmmacrosamd64.inc 854] 0b (Inline Function) ---------------- libcoreclr!CallDescrWorkerWithHandler0x59 [/__w/1/s/src/coreclr/vm/callhelpers.cpp 67]0c 00007f6d64489720 00007f6d66d19632 libcoreclr!DispatchCallSimple0xfe [/__w/1/s/src/coreclr/vm/callhelpers.cpp 220]0d 00007f6d644897b0 00007f6d66e02a6a libcoreclr!ExceptionNotifications::DeliverExceptionNotification0x420e 00007f6d64489800 00007f6d66e0269a libcoreclr!InvokeUnhandledSwallowing0xaa [/__w/1/s/src/coreclr/vm/comdelegate.cpp 3227]0f 00007f6d64489880 00007f6d66cbb5c3 libcoreclr!DistributeUnhandledExceptionReliably0x32a [/__w/1/s/src/coreclr/vm/comdelegate.cpp 3291]10 00007f6d64489aa0 00007f6d66cbb30f libcoreclr!AppDomain::RaiseUnhandledExceptionEvent0x93 [/__w/1/s/src/coreclr/vm/appdomain.cpp 4328]11 00007f6d64489b10 00007f6d66d160ad libcoreclr!AppDomain::OnUnhandledException0xdf [/__w/1/s/src/coreclr/vm/appdomain.cpp 4270]12 00007f6d64489b90 00007f6d66d14ebd libcoreclr!NotifyAppDomainsOfUnhandledException0xdd13 (Inline Function) ---------------- libcoreclr!InternalUnhandledExceptionFilter_Worker(_EXCEPTION_POINTERS*)::$_3::operator() const0xfc [/__w/1/s/src/coreclr/vm/excep.cpp 4815] 14 00007f6d64489c10 00007f6d66db7045 libcoreclr!InternalUnhandledExceptionFilter_Worker0x26d [/__w/1/s/src/coreclr/vm/excep.cpp 4896] 15 (Inline Function) ---------------- libcoreclr!ThreadBaseRedirectingFilter0xc [/__w/1/s/src/coreclr/vm/threads.cpp 7427]16 (Inline Function) ---------------- libcoreclr!ManagedThreadBase_DispatchOuter(ManagedThreadCallState*)::$_6::operator()(ManagedThreadBase_DispatchOuter(ManagedThreadCallState*)::TryArgs*) const::{lambda(PAL_SEHException)#1}::operator() const0x16 [/__w/1/s/src/coreclr/vm/threads.cpp 7525] 17 (Inline Function) ---------------- libcoreclr!ManagedThreadBase_DispatchOuter(ManagedThreadCallState*):_6::operator() const0x5d2 [/__w/1/s/src/coreclr/vm/threads.cpp 7525]18 00007f6d64489cc0 00007f6d66db71cd libcoreclr!ManagedThreadBase_DispatchOuter0x665 [/__w/1/s/src/coreclr/vm/threads.cpp 7549]19 (Inline Function) ---------------- libcoreclr!ManagedThreadBase_NoADTransition0x18 [/__w/1/s/src/coreclr/vm/threads.cpp 7593] 1a 00007f6d64489de0 00007f6d66e3b648 libcoreclr!ManagedThreadBase::FinalizerBase0x2d [/__w/1/s/src/coreclr/vm/threads.cpp 7619] 1b 00007f6d64489e10 00007f6d67150a2e libcoreclr!FinalizerThread::FinalizerThreadStart0x58 [/__w/1/s/src/coreclr/vm/finalizerthread.cpp 391] 1c 00007f6d64489e30 00007f6d6816aea5 libcoreclr!CorUnix::CPalThread::ThreadEntry0x24e [/__w/1/s/src/coreclr/pal/src/thread/thread.cpp 1865] 1d 00007f6d64489ee0 00007f6d6746fb0d libpthread_2_170x7ea5 1e 00007f6d64489f80 ffffffffffffffff libc_2_170xfeb0d 1f 00007f6d64489f88 0000000000000000 0xffffffffffffffff尼玛这一卦打的真离谱怎么终结器线程在 Sleep 里 接下来根据 !ip2md 00007f6cfea03ac9 将代码导出来截图如下image啥要暂停1h这代码真的有点看不懂了有知道的大牛看看这个逻辑咋样

相关新闻

3M SW50厨下净水器技术解析与使用指南

3M SW50厨下净水器技术解析与使用指南

1. 产品定位与核心功能解析这款3M SW50厨下净水器属于高端矿物质直饮机型,主打"智能监控矿物质保留"的双重卖点。从产品命名就能看出几个关键指标:3升/分钟的出水流量、6000L总净水量、厨下式安装方式。我拆过上百款净水设备,这种将…

2026/7/23 1:44:47阅读更多 →
【JAVA毕设源码分享】基于springboot影院购票管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot影院购票管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

2026/7/23 1:44:47阅读更多 →
【JAVA毕设源码分享】基于springboot养宠物指南服务平台系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot养宠物指南服务平台系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

2026/7/23 1:44:47阅读更多 →
深入解析Stellaris ADC可编程采样序列器:从原理到寄存器级实战

深入解析Stellaris ADC可编程采样序列器:从原理到寄存器级实战

1. 项目概述与ADC核心价值在嵌入式系统开发中,我们经常需要与外部模拟世界打交道,无论是读取一个电位器的位置、监测电池电压,还是采集来自各类传感器的微弱信号,都离不开一个关键角色——模数转换器(ADC)。…

2026/7/23 9:50:16阅读更多 →
基于LoRA的LLaMA3-8B微调实战:打造甄嬛传角色AI

基于LoRA的LLaMA3-8B微调实战:打造甄嬛传角色AI

1. Chat嬛嬛LLM微调项目概述 Chat嬛嬛是基于《甄嬛传》剧本数据,采用LoRA微调技术对LLaMA3-8B大语言模型进行个性化改造的项目。这个项目最吸引人的地方在于,它成功地将古典文学角色的人格特征注入到现代AI模型中,让一个冰冷的算法能够用甄嬛…

2026/7/23 9:50:16阅读更多 →
docker、kubernetes之间的关系

docker、kubernetes之间的关系

周末煮饺子聊到容器问题 周末和老婆一起包了顿饺子,“老公,我去买瓶醋,你把饺子先煮一下吧”。我笨手笨脚准备半天,还没煮完,老婆就回来了。我看着这一锅饺子问道:“老婆,你说这 饭店是怎么煮饺…

2026/7/23 9:50:16阅读更多 →
SolidWorks转CAXA工程图全流程与GB标准实践

SolidWorks转CAXA工程图全流程与GB标准实践

1. 项目背景与核心需求 在机械设计领域,2D工程图依然是生产制造环节的"通用语言"。作为机械专业毕业生,掌握从三维模型到标准工程图的转换技能是必备的职业素养。SolidWorks(简称SW)作为主流三维设计软件,与…

2026/7/23 9:50:16阅读更多 →
YOLOv11结合多尺度空洞注意力提升小目标检测性能

YOLOv11结合多尺度空洞注意力提升小目标检测性能

1. 项目概述:当YOLOv11遇上多尺度空洞注意力在目标检测领域,YOLO系列算法始终保持着标杆地位。最新发布的YOLOv11通过改进的主干网络和颈部架构,在COCO数据集上实现了51.5%的mAP(YOLO11m版本),同时比前代减…

2026/7/23 9:50:16阅读更多 →
CDN机房安全搭建与成本优化实战指南

CDN机房安全搭建与成本优化实战指南

1. CDN机房安全搭建的核心逻辑 CDN机房作为内容分发网络的物理载体,其安全性直接决定了整个网络服务的可靠性。与传统数据中心不同,CDN机房需要同时应对网络攻击和物理安全双重挑战。我曾参与过三个不同规模的CDN节点建设,发现大多数安全隐患…

2026/7/23 9:48:16阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →