【问题标题】:.NET causing private data memory leak?.NET 导致私有数据内存泄漏?
【发布时间】:2021-06-19 06:47:11
【问题描述】:

我目前正在为 Zenon Runtime 创建插件。它们是用 C# 编写的,然后被添加到运行时。

当我在没有插件的情况下运行运行时时,RAM 使用量始终保持在 30-100MB 左右。一旦我添加了插件,它就会非常缓慢地上升,直到运行时开始挂起并变得无响应,并且使用了大约 2 gig 的内存。

我现在正试图弄清楚这是否真的是我这边的内存泄漏,或者它是由 Zenon 应用程序引起的。

我已经创建了转储文件和 VMMap,还远程调试了插件。结果是:

远程调试:内存使用量约为 5MB(也许 Visual Studio 无法真正跟踪另一个运行时内的插件的内存?)

使用windbg 分析的转储文件:绝对没有使用内存。同样在最大 5-50MB 左右,非托管内存达到 800MB。

VMMap:堆为 75MB,映像为 300MB,托管堆为 60MB,映射文件为 50MB,但私有数据为 830MB

所以我的猜测是:私人数据是它被填满的主要原因。

我现在的问题:.NET 应用程序会导致私有数据/非托管内存填满吗?

无论如何我如何才能进行更详细的分析?

是的,我知道这是一个大问题,没有太多要展示的内容,但也许你可以帮助我确定我可以采取哪些步骤来确定问题......我现在很无能为力。

【问题讨论】:

  • 使用内存分析器查找堆积的对象。如果您要注册活动,请务必取消注册。
  • 谢谢!我也不会在转储文件中看到这些对象吗? Visualstudio 诊断工具是否足以做到这一点?
  • 我不知道如何读取转储文件,但我想是的,如果你知道你在做什么,你会看到它。 VS 诊断工具可能就足够了,它可以让您查看堆并拍摄快照
  • 谢谢。我目前正在使用 jetbrains mem 工具监控内存。现在它显示使用了 9MB .NET 和总共 160MB,我每隔几个小时拍摄一次快照以查看变化...
  • 这里完全是倾斜的评论,但有时第 3 方库可能完全不可救药。在这些情况下,您可以将它们包装在自己的 AppDomain 中,并根据需要创建/销毁该 AppDomain。 GL!

标签: c# .net memory memory-leaks


【解决方案1】:

.net 应用程序会导致私有数据/非托管内存填满吗?

是的,有几种方式:

  1. .net 应用程序包含非托管部分并不罕见。经常出于某种原因调用 C++ 代码。
  2. 可以直接分配本机内存见allochglobal
  3. 使用使用本机内存的资源。这包括框架中包含的一些对象。

有什么方法可以进行更详细的分析?

如果它确实是本机内存泄漏,则可能很难找到。然而,拥有本机内存的托管对象可能会泄漏。如果您不使用任何非托管代码,这很可能是这种情况。托管内存可能要小得多,因此不会那么明显。例如,如果您泄漏位图对象,这些对象会使用非托管内存来存储图像数据。

一个好的内存分析器应该允许您比较快照并显示新分配的对象列表。我知道的好的分析器不是免费的,但通常包括试用期。

【讨论】:

  • 感谢您的出色回答。调用 C++ 代码的部分可能很有趣……我的进程与运行时提供的库交互,我不知道超出该点会发生什么,所以这些调用可能会造成泄漏。 (遗憾的是,这似乎超出了我的控制)我目前正在录制快照,所以希望我很快就会有更多的情报......谢谢!
  • 我刚刚通过比较 2 台不同机器的 2 个快照(一个内存使用率低,一个内存使用率高)发现:在内存使用率高的快照上,有 3600 个排队的可终结对象,只有 90 个其中已定稿。在低内存使用快照上,有相同的对象,但几乎 100% 的对象已经完成。我想我可能已经找到了问题(这可能不是我的目的:()
  • @Markus Friedl 最终确定的对象本身可能表明存在问题。理想情况下,对象应该被处置,并且处置对象应该抑制终结。我将终结器视为一个安全网,即拥有它很高兴,但不应该依赖它。
  • 感谢您提供的信息!所以我在过去几天生成了一些快照。 .NET 总/使用量始终在 10MB 左右,而总 MB 随时间不断增加。查看所有快照,它告诉我在 11 种类型的可终结对象中有近 600 万个,目前有 960 个来自 2 种不同类型的队列。我想这可能是泄漏?
  • @Markus Friedl 终结器队列上的大量对象几乎肯定是个问题。应该可以使用调试器来检查终结器是否被阻止。另请参阅Com object blocking finalizer
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2015-07-06
  • 2014-06-07
  • 2013-11-20
  • 2011-10-28
  • 2016-01-18
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多