gpt4 book ai didi

.net - System.Threading.OverlappedData 导致大量内存碎片(异步等待)

转载 作者:行者123 更新时间:2023-12-01 00:38:49 26 4
gpt4 key购买 nike

我一直在慢慢耗尽内存。我已经使用 WinDbg 来查看内存转储,这是它的样子:

000007f975ee0630   557377     41027736 System.Object[]
000007f975f004d0 18781 47746604 System.Byte[]
000007f975efc358 561433 54013658 System.String
000000000137b170 7616 1322123700 Free

Total 7627101 objects
Fragmented blocks larger than 0.5 MB:
Addr Size Followed by
000000004a9f62b0 18.2MB 000000004bc28050 System.Threading.OverlappedData
000000004dc2ce68 16.1MB 000000004ec522e8 System.Threading.OverlappedData
0000000050adaec0 10.3MB 0000000051525620 System.Threading.OverlappedData
000000005d47fd98 10.2MB 000000005deab618 System.Threading.OverlappedData
0000000071718ab8 23.0MB 0000000072e13a80 System.Threading.OverlappedData
0000000072e13e50 11.8MB 00000000739e4898 System.ServiceModel.Channels.SocketConnection
00000000801a7830 29.7MB 0000000081f5dd60 System.Threading.OverlappedData
000000008264ab58 14.0MB 000000008344bac0 System.Threading.OverlappedData
000000008344bb30 11.6MB 0000000083fecf80 System.Threading.OverlappedData
0000000083fecff0 13.6MB 0000000084d8dae8 System.Threading.OverlappedData
0000000084d8db58 148.3MB 000000008e1d65f8 System.Threading.OverlappedData
0000000093db04e0 19.4MB 00000000951158b8 System.Threading.OverlappedData
0000000095115928 33.9MB 00000000972f2620 System.Threading.OverlappedData
00000000abaa6738 71.9MB 00000000b0285cb0 System.Byte[]

请注意,碎片堆中有更多项目,我只粘贴了超过 10MB 的项目。您可以看出主要问题是 System.Threading.OverlappedData。

最近我重构了所有使用 async & await 的代码,如下所示:
await Task.Factory.FromAsync<string, MessageSender>(
this.MessageFactory.BeginCreateMessageSender,
this.MessageFactory.EndCreateMessageSender,
this.Topic.Path,
null)
.ConfigureAwait(false);

有很多socket入站(socket)和出站(azure service bus)通信。如何避免这种内存碎片?

最佳答案

我认为你应该检查这些地方:

  • KB947862
  • this SO question and discussion

  • 我现在正在处理一个类似的问题:我的服务器在异步套接字上接收到大量客户端请求,但是由于多种原因,客户端没有正确结束他们的通信(很可能是由于频繁的 IP 更改 - 他们在 GPRS/3G 上移动)。这似乎使回调永远等待,而套接字上的 EndReceive 永远不会被调用,这使得那些重叠的对象(它们是 AsyncPinned)永远悬停在内存中,从而导致高内存使用率和碎片化。因此,关于限制并发连接数并由您自己确保过期连接被手动关闭的想法。

    关于.net - System.Threading.OverlappedData 导致大量内存碎片(异步等待),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137304/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com