如果你调试一个使用
这些分配的源头是
如何避免这些分配?
SocketAsyncEventArgs
的简单客户端应用程序,你会注意到Thread
和ExecutionContext
的分配。这些分配的源头是
SocketAsyncEventArgs.StartOperationCommon
,该方法在执行时会使用ExecutionContext.CreateCopy()
创建一个ExecutionContext的副本。
ExecutionContext.SuppressFlow
似乎是抑制此类分配的好方法。 但是,当在新线程中运行此方法时,它本身会生成分配。如何避免这些分配?
ExecutionContext
流? - Yuval ItzchakovExecutionContext
是如此重要? - Yuval ItzchakovSocketAsyncEventArgs
。 - caoSocketAsyncEventArgs
的重点是防止在内存中固定新分配的缓冲区 - 如果不使用SocketAsyncEventArgs
,则会出现内存碎片问题,而不是 GC 延迟。如果您只是为此操作创建了一个缓冲区,那么您有大约 100% 的机会防止堆压缩。由于Read
调用可能需要很长时间,因此您的堆变得非常分散(我们的套接字服务器达到了超过 99% 的碎片化 - 兆字节的内存空闲,但无法重复使用)。 - Luaan