如何检测大对象堆是不是导致内存不足异常

Posted

技术标签:

【中文标题】如何检测大对象堆是不是导致内存不足异常【英文标题】: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。他们总是适合某个地方。使用内存分析器。使用真实的生产数据测试您的服务。明年它会是两倍大,也覆盖一下。 【参考方案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.

【讨论】:

以上是关于如何检测大对象堆是不是导致内存不足异常的主要内容,如果未能解决你的问题,请参考以下文章

保留内存是不是会导致内存不足异常

如何检测内存不足的情况?

Hive - 内存不足异常 - Java 堆空间

JNA/ByteBuffer 没有被释放并导致 C 堆内存不足

理解 JVM 内存分配和 Java 内存不足:堆空间

大位图内存不足异常