2012-02-20 10 views
26

Estoy buscando algunas fugas de memoria en un servicio de larga ejecución (usando F #) en este momento. La única cosa "extraña" que he visto hasta ahora es la siguiente:pérdidas de memoria en Microsoft.FSharp.Control.Mailbox?

  • Puedo usar un MailboxProcessor en un subsistema con un QueueChannelCommands algebraica-tipo de datos con nombre (más o menos un montón de Agregar/get.commands - algunos con AsyncReplyChannels conectado)
  • cuando perfilo el servicio (usando Ants Memory Profiler) Veo instancias de matrices del tipo mencionado (la mayoría tiene una longitud 4, pero cada vez mayor) - todas vacías (nulas) cuyas referencias parecen estar en Control. Buzón: enter image description here

No puedo ver ningún archivo en mi código de este comportamiento (su código estándar se pueden encontrar en todos los buzones-ejemplo que hay - sólo un bucle con un let! = receive y una match Para seguir terminó con un return! loop()

Alguien ha visto este tipo de comportamiento antes o incluso sabe cómo manejar esto? ¿O es esto incluso un error (conocido)?

Actualización: el cultivo de las matrices es muy extraño - parece que no hay espacio adicional anexa sin beeing se utiliza correctamente: enter image description here

+0

la matriz parece ser el "mailbox.arrivals" internos de la MailboxProcessor si esto es de ninguna ayuda – Carsten

+1

Dave Thomas notó un comportamiento similar cuando se utiliza 'volver! loop() 'en el lado de un bloque try/catch: http://moiraesoftware.com/blog/2011/12/11/fixing-ahole/. No creo que sea el caso con tu programa. – pad

+0

sí, gracias, soy consciente de este problema, pero esto dio como resultado mucho más sobrecarga (encontró muchas cosas Async), ¡similar a cuando lo hace! en lugar de regresar se usa - aquí solo veo crecientes y vacías matrices sin problemas de asincronización. – Carsten

Respuesta

-5

.NET tiene su propio recolector de basura, que funciona bastante bien. La forma más común de causar pérdidas de memoria en tecnologías .NET es mediante la configuración de delegados, y no eliminarlos en deconstructors de objetos.

+0

Creo que es bastante seguro suponer que la pregunta asker sabe esto, a juzgar por la pregunta. Además, su respuesta no tiene nada que ver con MailboxProcessor, y mucho menos con el problema específico (matrices y su crecimiento). – ShdNx

+0

De hecho lo hago más: si la implementación de MailboxProcessor no funciona, nadie conecta ningún evento (supongo que eso es lo que significa) aquí – Carsten

+0

Esto fue solo un pequeño comentario sobre la gestión de pérdida de memoria en .NET. –

2

No soy un F # experto, por cualquier medio, pero tal vez se puede ver en la primera respuesta en este hilo:

Does Async.StartChild have a memory leak?

La primera respuesta menciona un tutorial para perfiles de memoria en la siguiente página:

Pero mencionan esta fuente abierta cinco rsión de F #

Y no estoy seguro de que es lo que busca (acerca de esta versión de código abierto de F # en el último punto), pero tal vez puede ayudar a encontrar la fuente de la fuga o prueba de que realmente está perdiendo memoria.

Espero que de alguna manera ayude de alguna manera?

, Tony

Cuestiones relacionadas