7

我正在使用 ANTS 内存分析器来诊断我在我的一个 .NET 2.0 应用程序中面临的内存泄漏增加。我在 7.5 小时内拍摄了该过程的 7 个快照,这是所获得数据的表格表示 -

在此处输入图像描述

G1 代表第 1 代大小和 G2 第 2 代大小。除非托管空间和私有字节外,所有其他值均以 MB 为单位。

我的问题是——

  1. 为什么即使堆大小很小,未使用的 .NET 空间也会如此之高?

  2. 我的大型对象堆最多达到 2 MB,在最后 3 个快照期间保持在 96 KB。那为什么会有这么高的大碎片,它们是造成高未使用空间的原因吗?

  3. 非托管空间不断增加。这是否会导致私有字节随着时间的推移而增加?

我无能为力解决这个问题,并进行了多次分析,但找不到合适的解决方案。我准备提供所需的任何其他数据。

4

1 回答 1

2

正如 Alex 已经指出的,这里可以找到对问题类大对象堆碎片的一个很好的解释:

https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/

这个问题在 .NET FX 开发团队中是众所周知的,并且一直在解决。使用最近的 FX 版本,这些症状很有可能会消失。

从 .NET 4.5.1 开始,将有一个 GC 方法调用,甚至可以压缩 LOH:http: //blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation- on-the-large-object-heap.aspx 但是,找到 LOHF 的根本原因将比仅仅擦除它浪费大量 ms 的堆更有效

如果您需要更多详细信息,请告诉我如何隔离此类影响。

塞布

于 2013-10-18T12:50:54.097 回答