【问题标题】:Where do memory leaks go in .NET applications.NET 应用程序中的内存泄漏在哪里
【发布时间】:2014-07-09 19:23:19
【问题描述】:

我的 .NET 应用程序可以通过 .NET 程序集访问 c++ API。 假设我没有在 Dispose 方法中正确释放非托管资源/对象。

内存只是在application.exe中增加还是内存泄漏也可以在application.exe之外,所以我可以确定当应用程序退出时我会恢复所有内存?

【问题讨论】:

  • 你能给我们看一些代码吗?你真的有内存泄漏吗? C++ API 是标准 C++ 还是托管 C++?
  • 如果它是托管 C++ 那么它不应该泄漏,手指交叉。 AppDomain 最终会清理所有内容,但在清理之前内存利用率仍然很高。
  • 如果您使用托管 C++ 调用非托管(本机)C++ 代码,如果本机代码希望您清理内存,则会导致内存泄漏。
  • @MauriceReeves 托管 C++ 可以是混合模式程序集,这意味着它可以使用 newgcnew。前者不由 GC 处理。
  • @LucasTrzesniewski 这是真的。没有考虑到。我认为OP需要发布一些代码。这里有太多变数。

标签: .net unmanaged managed


【解决方案1】:

在.exe进程中。

您可以使用 perfmon 来监视进程,在发生非托管内存泄漏的情况下,您会看到总内存的计数器上升,但 .NET 内存将保持稳定。

使用这些 PerfMon 计数器来做到这一点:

处理/私有字节, .NET CLR 内存/所有堆中的# 字节,

如果发生未经检查的非托管内存泄漏(即您不断泄漏内存),您的应用程序最终会崩溃。

更多信息请参见此主题:Detecting memory leak in mixed environment(Managed-Unmanaged)

【讨论】:

    【解决方案2】:

    如果您通过非托管 API 泄​​漏内存,它会像往常一样泄漏。它会在进程内存空间中丢失。

    .NET 没有什么不寻常的地方。

    另外,如果您的非托管库在共享内存空间中分配内存......那么它会在那里泄漏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 2012-04-09
      相关资源
      最近更新 更多