2

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 通信を使用して、信頼性を確保します。

これらの大きなオブジェクトがメモリに残るのを防ぐためにできることはありますか?

4

1 に答える 1

1

WCF 構成のMaxBufferPoolSizeandプロパティを調整する必要があります。MaxBufferSizeアプリケーションの性質に合った最適な値を実験する必要がある場合があります。これは、メッセージのサイズ、同時リクエストの数などによって異なります。

0 に設定MaxBufferPoolSizeして、バッファのプーリングを禁止することもできます。まだバッファリングされていますが、バッファはプールされていません。バッファプールにはメモリ割り当てを減らすという利点があるため、これが本当に必要かどうかを確認してください。

これは、これらの設定が実際に何を意味し、なぜ実際に必要なのかについての説明です。

于 2013-02-23T17:32:10.990 に答える