【问题标题】:Need help analyzing ASP.Net Core 3.1 memory dump需要帮助分析 ASP.Net Core 3.1 内存转储
【发布时间】:2020-10-19 06:24:18
【问题描述】:

我已准备好为此付费!

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

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

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

这就是我需要帮助的地方。我真的不知道如何处理这些保留路径。我期待如果问题出在我的代码中,我应该在保留路径的底部找到我的应用程序的某个类?我需要帮助,试图从这些保留路径中找出问题所在。

【问题讨论】:

  • 建议:熟悉 MSVS Memory Usage 诊断工具
  • 得承认我有点困惑,因为 dotMemory 是一个商业产品,有大量的支持信息、文档、YouTube 视频、howtos 和支持它的公司支持团队,为什么你需要以这种方式(或根本)问这个问题。您是否与 jetbrains 有任何未公开的从属关系?如果你愿意付钱给任何人,也许从 jb 购买完整的产品并让他们指导如何使用它会是最有效的
  • 不是 dotMemory 产品支持问题。这是一个关于理解保留路径告诉我的一般问题。我已经查看了 dotMemory 在线文档和示例。基于此,我在我的问题中添加了以下声明:如果问题出在我的代码中,我希望在保留路径中看到我自己的项目类之一。但我所看到的只是核心库类。我是否相信问题出在 .Net Core DI 系统中?
  • 启用在 dotMemory 中收集分配信息并查看创建了哪些 JsonSerializerOptions 堆栈跟踪实例。它会提示您应该释放或处置哪些对象,以避免将它们保留在内存中。

标签: c# asp.net-core memory-management memory-leaks dotmemory


【解决方案1】:

事实证明,问题是由于一个错误导致的,在该错误中,灵活的、运行时定义的数据库查询正在重新调整 Object 类型的实例,而不是 dynamic 类型的实例。 JsonSerializer 正确地不会缓存 dynamic 类型,但它会缓存 Object 类型。

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

【讨论】:

  • dynamic 类型在编译后不再是dynamic,CLR 将其视为只是一个object,我认为这与您的内存泄漏无关。我认为你走在正确的轨道上,但也许你的结论有点太早了? :)
  • 不,这个改变确实解决了我的内存泄漏问题。
【解决方案2】:

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

但是

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

【讨论】:

  • 感谢您的反馈;它提醒我添加我的发现作为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
相关资源
最近更新 更多