【问题标题】:Web-application has very high memory usage compared to .NET total in dotMemory与 dotMemory 中的 .NET 总量相比,Web 应用程序的内存使用率非常高
【发布时间】:2017-12-12 10:37:29
【问题描述】:

下图很好地说明了我的问题。

我有一个应用程序,它占用了它可以获取的所有内存。 图像中的快照是在 5-10 分钟的时间跨度内拍摄的。在上一个快照中,我尝试通过 dotMemory 强制执行 GB。

在周末,它吃掉了服务器上 60Gb 的可用内存,IIS 重新启动了进程,然后一切都回到应用程序,从 1Gb 开始,然后又吃掉了 60Gb。

.NET 总量和使用的 .NET 似乎一直在增长,但没有应用程序消耗的总内存那么多。

看快照之间的比较“系统”似乎是拥抱所有内存的命名空间。它远远领先于排名第二的“微软”。

展开“系统”窗格可以看到以下视图。

我将如何进一步分析?当我尝试查看“密钥保留路径”时,我得到以下信息,这似乎对我没有太大帮助。

我以前玩过 dotMemory,但我以前从未经历过这样的事情。通常我可以快速找到一些我自己的命名空间,并通过它缩小到我的代码中我忘记处理某些东西的位置。

我尝试查找其他问题,但似乎没有一个问题与我的情况相同。如果您知道我尚未找到的问题,请随时向我指出另一个问题的方向。

【问题讨论】:

  • 从类型统计数据来看,您可能正在创建大量动态内容(程序集),这些内容消耗的内存未计入各种工具中的“.NET used”中。我将开始使用 VMMap 工具查看您的流程。看看什么样的区域正在消耗你的内存 - 大小如几十 GB,你会很快发现它。

标签: .net memory memory-leaks garbage-collection dotmemory


【解决方案1】:

快照中的所有内存都是托管内存。 您的应用程序的本机代码内部存在巨大的内存泄漏。 一些 Collection 或 XML 对象保留在内存中,然后保留一些本机内存。

在 dotTrace 中,您无法看到谁保留了您的原生记忆(目前)。您可以使用 ANTS Memory Profiler 执行此操作。或者原生部分的 Deleaker。

【讨论】:

  • 我不再受雇于该公司,因此我无法验证使用 ANTS 是否会显示内存泄漏。但这听起来确实是一个可靠的计划,下次遇到类似问题时我会尝试一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多