.NET应用程序内存使用情况 - 高度未使用的.NET和非托管内存和碎片

Cyg*_*nus 5 .net memory-management red-gate-ants memory-fragmentation

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

在此输入图像描述

G1代表1代尺寸和G2代2尺寸.除非托管空间和专用字节外,所有其他值均以MB为单位.

我的问题是 -

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

  2. 我的大对象堆最多大约2 MB,在最后3个快照中保持96 KB.那么为什么会出现如此高的大碎片,它们是否对未使用的空间负责?

  3. 不受管理的空间不断增加.这会导致私有字节数随时间增加吗?

我最终解决了这个问题,已经进行了多次分析,但无法找到适当的解决方案.我准备提供所需的任何其他数据.

小智 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 的根本原因比仅仅擦除堆中浪费大量毫秒的效率要高得多

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

塞布