【问题标题】:OutOfMemoryException, large Private DataOutOfMemoryException,大量私有数据
【发布时间】:2010-03-31 09:32:09
【问题描述】:

在之前的系列中:

OutOfMemoryException, stack size is huge, large number of threads

我有一个消耗大量内存的 .net windows 服务。 GC堆不大。堆栈大小也不大。重要的是所谓的私人数据。我还可以在任务管理器中看到我的应用程序消耗了很多任务管理器调用句柄的东西。我的应用程序消耗 2326 个句柄。我相信这些句柄是一些占用私有数据的窗口句柄。我可以看到这个私有数据被 标记为线程环境块的块。那是什么?

Screenshot of my application memory usage by VMMap

Screenshot of my application memory usage by Task Manager

更新

我运行 ProcessExplorer。目前我的服务有两个实例正在运行。 我可以看到它们为 Gen2 GC 消耗了大量的虚拟内存。这看起来很可疑。 为 GC Heap 保留的总大小对于两个进程也是相同的。

【问题讨论】:

  • Process Explorer 可以显示这些句柄是什么(以及许多其他有用的东西)。你可以在这里找到它:technet.microsoft.com/en-us/sysinternals/bb896653.aspx。选择视图 -> 下窗格视图 -> 句柄。
  • 您好!你设法解决了这个问题吗?我有一个类似的(高私有数据内存使用率和 OOM)。

标签: .net memory-leaks memory-management taskmanager window-handles


【解决方案1】:

您似乎有典型的内存泄漏,当新创建的对象由于从垃圾收集根中引用而无法收集时。

摆脱此类问题的最有效方法 - 使用 WinDBG + SOS 和 !gcroot 命令。可以在这里找到内存泄漏错误调查的示例:http://blogs.msdn.com/tess/archive/2008/04/03/net-debugging-demos-lab-7-memory-leak-review.aspx

祝你好运!

【讨论】:

  • 不,他会看到一个很大的 GC 堆。
【解决方案2】:

是的,非常消耗资源。我猜你用 [ThreadStatic] 属性标记的变量。你的线程方式太多了。

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2011-02-09
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多