首页 > 解决方案 > .NET 导致私有数据内存泄漏?

问题描述

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

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

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

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

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

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

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

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

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

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

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

标签: c#.netmemorymemory-leaks

解决方案


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

是的,在几个方面:

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

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

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

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


推荐阅读