如何删除 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 配置的 MaxBufferPoolSizeMaxBufferSize 属性。您可能需要对适合您应用程序性质的最佳值进行试验,这取决于您的消息大小、并发请求数等。

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

这是关于what those settings actually means和why it is actually needed的一些解释。

【讨论】:

以上是关于如何删除 ServiceHost 持有的大对象堆上的 Byte[]的主要内容,如果未能解决你的问题,请参考以下文章

(c++) 堆上没有任何指针的对象会发生啥?

objective-c高级编程 笔记

WCF:如何从 ServiceHost 获取端点列表?

C++ 删除静态数据

如何删除单例对象

如何将参数传递给 ServiceHost