如何删除 ServiceHost 持有的大对象堆上的 Byte[]
Posted
技术标签:
【中文标题】如何删除 ServiceHost 持有的大对象堆上的 Byte[]【英文标题】:How to remove a Byte[] on the Large Object Heap that is being held by ServiceHost 【发布时间】:2012-09-13 11:01:22 【问题描述】:我有一个使用 HTTP 协议的 WCF 服务。当一个特别大的查询到达系统时,它会创建一个大的 Byte[],通过缓冲区引导到 HttpChannelListener 并最终到达服务主机本身。即使在 WCF 事务完成后,它仍然存在。这反过来会导致大型对象堆碎片化,最终导致应用程序抛出 OOM 异常。
这是 Byte[] 的路径: ServiceHost.channelDispatchers.items._items[0].listener.innerChannelListener.typedListener.bufferManager.innerBufferManager.bufferPools[13].pool.globalPool.items._array[0]
系统使用缓冲的 WCF 通信进行事务以确保其可靠。
有什么办法可以防止这些大对象留在内存中吗?
【问题讨论】:
【参考方案1】:您需要调整 WCF 配置的 MaxBufferPoolSize
和 MaxBufferSize
属性。您可能需要对适合您应用程序性质的最佳值进行试验,这取决于您的消息大小、并发请求数等。
您也可以将MaxBufferPoolSize
设置为 0 以禁止缓冲池。它仍然缓冲,但缓冲区没有池化。确定这是否真的是您想要的,因为缓冲池确实具有减少内存分配的优势。
这是关于what those settings actually means和why it is actually needed的一些解释。
【讨论】:
以上是关于如何删除 ServiceHost 持有的大对象堆上的 Byte[]的主要内容,如果未能解决你的问题,请参考以下文章