#0代堆中的巨大空白

我目前正在调查内存泄漏,我无法真正解释它,现在正在寻找有用的链接或想法。

这是应用程序本机内存的屏幕截图(由.NET Memory Profiler制作):

http://img1.mukewang.com/60aa065b00015a0d06900622.jpg

该应用程序大约需要2.2 GB(正常)。当应用程序具有约3.5 GB的空间时,将进行转储。我目前无法解释第0代的这些差距。对我来说,这似乎是因为垃圾收集器无法缩小第0代中的差距。

为了提出一个明确的问题:

  • 这些差距是如何发生的?对我来说,这似乎是因为GC已收集了死对象,但没有压缩堆。我知道我无法触发或强制GC压缩堆。

我在此站点上搜索了类似的问题,但其中大多数与LOH有关(对于我而言,这似乎很好)。唯一存在某种类似的巨大差距的问题是:什么是GC漏洞,但我看不到2 KB的代号为0的固定实例如何产生1 GB的漏洞。另一个问题是关于触发GC GC阈值的阈值。但是我不敢相信没有一个单一的压缩阶段。


陪伴而非守候
浏览 149回答 2
2回答

墨色风雨

直到今天,我仍然不确定是什么引起了这个问题,但是已经通过这种方式解决了。首先,我有一些Windows Dumps和NMP Dumps,并在其中做了很多准备(WinDBG很有帮助)。在那里,我发现某些数据与套接字有关。因此,唯一的办法就是将当前的套接字实现从Begin *调用重写为* Async调用。(请参阅此问题)在那里,我们遵循了msdn的实现。(创建一个大缓冲区并重用它)。特别是那里的评论指向那个方向:    // Allocates one large byte buffer which all I/O operations use a piece of.  This gaurds      // against memory fragmentation差距现在还没有消失,但是差距要小得多,而且不会再增长了……
打开App,查看更多内容
随时随地看视频慕课网APP