2012-09-13 3 views
2

WCF 서비스에서 HTTP 프로토콜을 사용하고 있습니다. 특히 큰 쿼리가 시스템에 도달하면 버퍼를 통해 HttpChannelListener로 연결되고 결과적으로 서비스 호스트 자체로 연결되는 큰 Byte []가 만들어집니다. 이것은 WCF 트랜잭션이 완료된 후에도 그대로 유지됩니다. 이로 인해 결국 Large Object Heap 조각화가 발생하여 결국 응용 프로그램이 OOM 예외를 throw합니다. 여기 ServiceHost에서 보유중인 Large Object Heap에서 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 meanswhy it is actually needed에 대한 몇 가지 설명입니다.