You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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规则:
    <PropertyGroup>
      <ServerGarbageCollection>false</ServerGarbageCollection>
      <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    </PropertyGroup>
    
    同时在runtimeconfig.json中添加GC内存限制,避免运行时无限制占用内存:
    {
      "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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:48:02