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: y la "raíz" es el siguiente: Fuga 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!
¿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? –
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
Deberías poder lanzarlo a 'IClientChannel' –