【问题标题】:Heap vs Managed Heap堆与托管堆
【发布时间】:2011-05-11 17:20:44
【问题描述】:

我有一个大型 .NET 应用程序,目前正在达到 865MB 的私有工作集大小。

所以我运行了 VMMap,发现堆大约 587MB,托管堆只有 255MB(也是私有工作集)。

让所有这些非托管代码使用这么多内存(我想 .net 运行时正在使用)是否正常?

注意:我使用的是带有 SOS 扩展的 WinDbg。问题不在于托管堆中的内存消耗,而是“非托管”堆。

VMMap 截图:http://img687.imageshack.us/img687/1529/vmmap.png

更多信息: 总大小:1487MB 已提交:1359MB 私人:931MB 总 WS:967MB 私人 WS:865MB 免费(大小):609MB

提前致谢。

【问题讨论】:

    标签: memory memory-management .net-3.5 heap-memory working-set


    【解决方案1】:

    是的!如果未正确释放非托管对象,甚至会导致更多内存泄漏。我曾经发现 obcconnection 对象占用了大量 RAM(它试图在循环中打开/关闭连接)。以至于应用程序最终会耗尽内存并崩溃。

    您正在处理哪些非托管对象?

    【讨论】:

      【解决方案2】:

      使用 CLRProfiler (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&DisplayLang=en) 查看堆上的对象。

      注意:.NET 2.0 版本也适用于 .NET 4.0。

      【讨论】:

      • 也许更轻量级和快速上手是 SOS msdn.microsoft.com/en-us/library/bb190764.aspx
      • 实际上我认为这不会有太大帮助,因为我已经在 WinDbg 中分析了托管堆中的 CLR 对象并且一切看起来都很好。
      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      相关资源
      最近更新 更多