『神坑』DotNetty 内存泄漏 解决办法
背景
近来在用 DotNetty 实现一个文件上传下载的同步服务。
其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘。
—— 非常简单的代码,都写了几十次了,驾轻就熟。
问题来了
可是:在进行压力测试时,我这边下载一个 Win10 的 ISO 镜像,4个G。
我发现:客户端内存不停增长,直到内存溢出 —— 我擦。
VS2015内存诊断
内存诊断,我们发现 有很多 16M(16777228字节) 的 byte[] 占据着内存。
而我请求服务端的 文件分片 只有 64K
—— 于是我肯定:这些 16M 的 byte[] 肯定是 DotNetty 创建的。
调试代码
通过调试代码,确实发现了 这些 16M 字节所在的位置:
((DotNetty.Buffers.PooledByteBufferAllocator)
((DotNetty.Transport.Channels.AbstractChannelHandlerContext)context)
.Allocator)
.directArenas
简写就是:
context.Allocator.directArenas
知道了 内存泄漏 的数据 存在哪里,剩下的就是 删除这些数据。
因为
Allocator
和directArenas
都是不可访问的(私有类型)我猜:按照微软框架的习惯,肯定有 属性 或 方法 能够设置 这个东西。
—— 是我想太多,我找了好久 都找不到 相关方法。
万能解法:反编译
直到数据在哪里,肯定有修正这些数据的方法。
反射是万能的 —— 但是我不想用。
于是,开始反编译:查看这个 directArenas
字段在哪里 赋值、哪里添加数据。
---------------------------------------------------------------------
---------------------------------------------------------------------
---------------------------------------------------------------------
问题解决
再次运行程序,内存稳定在 30M —— 内存泄漏问题解决。
这次修改BUG,最废时间的 莫过于 DotNetty 毫无微软风格。
微软框架基本都有一个风格:底层一定提供了各种 函数、属性 —— 默认会给你一个 最稳定的默认值。
尼玛,这分明是 Java 的尿性:各种参数千奇百怪,不配参数还不能运行 —— 给我个默认参数 有那么难么~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库