ASP.NET Core 3.1搭配Angular 10.2非托管内存不释放问题求助
ASP.NET Core 3.1 非托管内存泄漏排查解决思路
- 首先通过.NET诊断工具确认非托管内存具体占用来源:
使用官方dotnet-dump工具采集高负载下的进程转储:
加载转储后依次执行以下命令排查:dotnet-dump collect -p <目标进程ID>eeheap -gc查看托管堆总大小,和进程总内存的差值即为非托管内存总占用量dumpheap -type SafeHandle排查托管代码持有的非托管句柄泄漏dumpheap -stat统计所有托管对象类型,查看是否有大量未释放的绑定非托管资源的对象实例
- 优先修复版本已知缺陷:
ASP.NET Core 3.1已于2022年12月停止官方支持,Kestrel服务器、HttpClientFactory、响应缓存中间件、压缩中间件均存在官方确认的非托管内存泄漏漏洞,建议先升级到3.1最后一个补丁版本3.1.32,条件允许的情况下迁移到仍在支持期的.NET 6或.NET 8 LTS版本 - 排查基础组件泄漏场景:
- 若使用前后端整合模板,排查静态文件中间件泄漏:测试环境临时关闭静态文件压缩和缓存验证是否为该模块导致
- 排查项目引用的NuGet包:System.Drawing.Common、旧版System.Data.SqlClient、第三方日志/序列化组件都存在隐式调用非托管代码导致泄漏的可能,可逐一注释对应功能验证
- 调整GC运行配置:
你之前修改的配置大概率是服务端GC开关,若为容器/低配置服务器部署,可在项目配置文件中固定GC规则:
同时在runtimeconfig.json中添加GC内存限制,避免运行时无限制占用内存:<PropertyGroup> <ServerGarbageCollection>false</ServerGarbageCollection> <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection> </PropertyGroup>{ "runtimeOptions": { "configProperties": { "System.GC.HighMemoryPercent": 70, "System.GC.RetainVM": false } } } - 跟踪非托管分配调用栈:
使用dotnet-trace工具直接捕获非托管内存分配的调用栈,精确定位泄漏来源:dotnet-trace collect -p <目标进程ID> --providers Microsoft-Windows-DotNETRuntime:0x1000000018:4
内容的提问来源于stack exchange,提问作者Travis Walker
相关产品推荐
相关产品推荐

