2012-02-21 11 views
6

Hola tengo un problema con un servicio que ejecuta WCF en modo dúplex. Tiene una pérdida de memoria (no mucho pero es de unos 80MB por día) y después de tener un perfilador de memoria funcionando junto con el servicio durante 24 horas, encontré la mayor parte de la memoria en byte[] mencionado como un desastre, pero la mayoría de las referencias terminan en algo como esto: one path holding the byte[] - array y la "raíz" es el siguiente: rootFuga de memoria en WCF (dúplex) en el servidor

también veo un montón de ServiceChannel (alrededor de 200) comming (creo) de los canales de devolución de llamada.

Estoy bastante seguro de que solo tengo 1 de esos para cada uno de los clientes conectados.

En general, mi problema parece ser casi el mismo que este: memory leak in silverlight Wcf implementation pero en el lado del servidor.

Incluso probé la cosa [MTAThread] que se menciona aquí: WCF service leaks handles and memory when a client times out pero simplemente no resuelve el problema.

Simplemente no creo que el problema esté en mi código ya que envuelvo los canales de devolución de llamada después de obtenerlo con OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>() en uno de mis propios objetos y no se filtran (solo hay uno para cada uno) clientes en la memoria en cualquier instantánea dada) - seguro reiniciaré esas devoluciones de llamada en varias ocasiones ya que el canal podría cambiar (clientes perdiendo la conexión o reconectando) pero no tengo una manera de deshacerme de las referencias antiguas así que solo las dejo caer y el GC debería hacer su trabajo en ellos.

Uso PerCall en mi servicio, así que no tengo ningún control para esos objetos en mi código.

que realmente no tienen idea de lo que puedo manejar esto a un lado de reiniciar el servicio cada pocos días - una solución que no quiero probose en este momento :(

Así que por favor, dame un poco de ayuda/consejos sobre esto - muchas gracias!

+0

¿Ve una mayor ganancia de memoria si los clientes fallan mucho y tiene que volver a crear el canal de devolución de llamada? ¿"Cancelas" el canal de devolución de llamada si el cliente se ha ido? –

+0

Es difícil para mí decirlo, pero este podría ser el caso, y no, no aborto el canal en el servidor (¿cómo puedo hacer esto?) Usando 'GetCallbackChannel ' Solo obtengo 'T' - ¿tiene que elegir? esto en algún tipo de proxy?) – Carsten

+1

Deberías poder lanzarlo a 'IClientChannel' –

Respuesta

7

Cuando un canal basado en la sesión falla una llamada al Close lanzará una excepción. Sin embargo, hay recursos del lado del servidor que no se limpian en este caso y solo se limpian cuando Abort el canal con errores

Asegúrese de que cuando reemplace una falla ed canal que Abort el anterior primero

+0

muchas gracias! – Carsten