需要帮助分析 ASP.Net Core 3.1 内存转储

Need help analyzing ASP.Net Core 3.1 memory dump

我准备为此付费寻求帮助!!

我的 ASP.Net Core 3.1 应用程序从大约 450MB 开始,逐渐增加到大约 4.5GB(我怀疑如果有更多可用内存,它会增长得更多)。

我在各个阶段进行了内存转储,使用 dotMemory 分析它们似乎表明 JsonSerialiserOptions 是主要嫌疑人:

钻到 JsonSerializerOptions 显示了 3 个实例。两个数字可以忽略不计,如果我进一步深入研究内存使用率最高的 3 个中的一个,它的 Key Retention Path 显示如下:

这就是我需要帮助的地方。我真的不知道如何使用这些保留路径。我希望如果问题出在我的代码中,我应该在保留路径的底部找到我的应用程序的一些 class?我需要帮助来尝试从这些保留路径中找出问题可能出在我的代码中的什么地方。

我怀疑您的问题与重新加载更改令牌有关。早在 .NET 2.1 中就报告了内存泄漏 - 更多详细信息如下:https://github.com/dotnet/aspnetcore/issues/6102

但是

如果您的目标是较新版本的 .Net,我建议您检查您的 ConfigureServices() 方法 (Startup.cs) 并消除 misconfigured services lifetimes and/or captive dependencies.

事实证明,问题是由于一个错误造成的,在该错误中,一个灵活的、运行-time-defined 数据库查询正在重新调整类型 Object 的实例,而不是类型 [=11] 的实例=]. JsonSerializer 正确地不缓存 dynamic 类型,但它确实缓存 Object 类型。

所以每次查询 运行 时,JsonSerializer 都会缓存 Object 结构。修复是为了确保数据库查询返回 dynamic 类型而不是 Object 类型。