【问题标题】:How to detect if the large object heap is causing the out of memory exception如何检测大对象堆是否导致内存不足异常
【发布时间】:2011-03-03 19:32:37
【问题描述】:

我的 .NET Windows 服务中出现 System.OutOfMemory 异常。我不确定是什么原因造成的。我怀疑大对象堆中有碎片,但我不确定。如何验证我的假设?

我可以使用各种调试器,但我应该在调试器中寻找什么?

谢谢

【问题讨论】:

  • 您最初是否尝试过调试源代码以发现任何明显的问题?
  • 嗯,这是给定的,你永远不会在小对象上得到 OOM。他们总是适合某个地方。使用内存分析器。使用真实的生产数据测试您的服务。明年它会是两倍大,也覆盖一下。

标签: .net memory-management out-of-memory large-object-heap


【解决方案1】:

CLR Profiler 是你的朋友。它可以附加到 Windows 服务并收集您需要的所有指标,以便在您的 OOM 命中时找出罪魁祸首。

【讨论】:

  • 我应该在 CLR Profiler 中寻找什么来让我知道原因是否是大对象堆?
  • 对于您的特定场景,我会说从最终堆字节直方图开始,然后找出什么类型的对象正在占用您的内存。从那里,您可以右键单击并选择 Show Who Allocated,然后查找哪些方法正在分配这些大对象。
  • 如果大对象堆永远不会超过 60 MB,它是否仍然是我的内存不足异常的原因
  • 如果你有很多被分配和释放的对象,是的。 LOH 永远不会被压缩,因此可能会出现间隙,并且可能会有一个点无法再容纳一个对象。
  • @Jesse C. Slicer - 但如果发生这种情况,LOH 会不会显得很大,因为 .NET 框架会扩展它以适应当前无法适应的大对象?还是大对象堆计数器只显示占用空间而不显示空闲空间?
【解决方案2】:

我猜这在您的机器上调试时是随机发生的,并且永远不会,对吧?

您可以做的是创建转储并分析遗骸。

您需要求助于真正的调试大师 Tess。她是调试界的 Chuck Norris。

Check this out, for example.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多