为了账号安全,请及时绑定邮箱和手机立即绑定

#0代堆中的巨大空白

#0代堆中的巨大空白

C#
陪伴而非守候 2021-05-16 13:14:42
我目前正在调查内存泄漏,我无法真正解释它,现在正在寻找有用的链接或想法。这是应用程序本机内存的屏幕截图(由.NET Memory Profiler制作):该应用程序大约需要2.2 GB(正常)。当应用程序具有约3.5 GB的空间时,将进行转储。我目前无法解释第0代的这些差距。对我来说,这似乎是因为垃圾收集器无法缩小第0代中的差距。为了提出一个明确的问题:这些差距是如何发生的?对我来说,这似乎是因为GC已收集了死对象,但没有压缩堆。我知道我无法触发或强制GC压缩堆。我在此站点上搜索了类似的问题,但其中大多数与LOH有关(对于我而言,这似乎很好)。唯一存在某种类似的巨大差距的问题是:什么是GC漏洞,但我看不到2 KB的代号为0的固定实例如何产生1 GB的漏洞。另一个问题是关于触发GC GC阈值的阈值。但是我不敢相信没有一个单一的压缩阶段。

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

直到今天,我仍然不确定是什么引起了这个问题,但是已经通过这种方式解决了。首先,我有一些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

差距现在还没有消失,但是差距要小得多,而且不会再增长了……


查看完整回答
反对 回复 2021-05-23

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号