Как удалить байт [] в куче больших объектов, удерживаемой ServiceHost

У меня есть служба 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 для транзакций, чтобы обеспечить ее надежность.

Могу ли я что-нибудь сделать, чтобы эти большие объекты не оставались в памяти?


person gin drskvy    schedule 13.09.2012    source источник


Ответы (1)


Вам необходимо настроить свойства MaxBufferPoolSize и MaxBufferSize вашей конфигурации WCF. Возможно, вам придется поэкспериментировать с тем, какое значение лучше всего соответствует характеру вашего приложения, это зависит от размера вашего сообщения, количества одновременных запросов и т. д.

Вы также можете установить MaxBufferPoolSize в 0, чтобы запретить объединение буферов. Он все еще буферизуется, но буфер не объединен. Убедитесь, что это действительно то, что вам нужно, потому что пул буферов имеет преимущество, уменьшая выделение памяти.

Это некоторое объяснение каких настроек на самом деле означает и зачем это на самом деле нужно.

person chenz    schedule 23.02.2013