2

我有一个 WCF 服务,它使用 HTTP 协议。当一个特别大的查询到达系统时,它会创建一个大的 Byte[],它通过缓冲区引导到 HttpChannelListener 并最终到达服务主机本身。即使在 WCF 事务完成后,它仍然存在。这反过来会导致大型对象堆碎片,最终导致应用程序抛出 OOM 异常。

这是 Byte[] 的路径:ServiceHost.channelDispatchers.items._items[0].listener.innerChannelListener.typedListener.bufferManager.innerBufferManager.bufferPools[13].pool.globalPool.items._array[0]

系统对事务使用缓冲的 WCF 通信以确保其可靠。

我能做些什么来防止这些大对象留在内存中吗?

4

1 回答 1

1

您需要调整 WCF 配置的MaxBufferPoolSizeandMaxBufferSize属性。您可能需要对适合您的应用程序性质的最佳值进行试验,这取决于您的消息大小、并发请求数等。

您也可以设置MaxBufferPoolSize为 0 以禁止缓冲池。它仍然缓冲,但缓冲区没有池化。确定这是否真的是您想要的,因为缓冲池确实具有减少内存分配的优势。

这是对这些设置的实际含义以及实际需要它的原因的一些解释。

于 2013-02-23T17:32:10.990 回答