Mi programa, por desgracia, tiene una pérdida de memoria en alguna parte, pero estaré condenado si sé de qué se trata.Estrategias para rastrear fugas de memoria cuando has hecho todo lo contrario
Su trabajo es leer en un grupo de ~ 2MB archivos, hacer algunos análisis sintácticos y reemplazo de cadenas, y luego darles salida en varios formatos. Naturalmente, esto significa muchas cuerdas, y al hacerlo, el seguimiento de memoria muestra que tengo muchas cuerdas, que es exactamente lo que esperaría. La estructura del programa es una serie de clases (cada una en su propio hilo, porque soy un idiota) que actúa sobre un objeto que representa cada archivo en la memoria. (Cada objeto tiene una cola de entrada que utiliza un bloqueo en ambos extremos. Si bien esto significa que puedo ejecutar este proceso simple en paralelo, también significa que tengo varios objetos de 2MB en la memoria). La estructura de cada objeto está definida por un objeto de esquema .
Mis clases de procesamiento generan eventos cuando han procesado y pasan una referencia al objeto grande que contiene todas mis cadenas para agregarlo a la cola del siguiente objeto de procesamiento. Reemplazar el evento con una llamada de función para agregar a la cola no detiene la fuga. Uno de los formatos de salida requiere que use un objeto no administrado. La implementación de Dispose() en la clase no detiene la fuga. He reemplazado todas las referencias al objeto de esquema con un nombre de índice. No dados. No tengo idea de qué lo está causando, y no tengo idea de dónde mirar. La traza de memoria no ayuda porque todo lo que veo es un conjunto de cadenas que se crean, y no veo dónde se quedan las referencias en la memoria.
Estamos a punto de darnos por vencidos y retroceder en este punto, pero tengo una necesidad patológica de saber exactamente cómo me equivoqué. Sé que Stack Overflow no puede peinar exactamente mi código, pero ¿qué estrategias puede sugerir para rastrear esta fuga? Probablemente voy a hacer esto en mi propio tiempo, por lo que cualquier enfoque es viable.
+1 Llamo a esto "búsqueda binaria", porque deshabilito la mitad del código y pruebo para ver si el problema todavía existe. Repita con la otra mitad. Suponiendo que obtenga resultados consistentes, ahora puedo deshabilitar la mitad del medio que contiene el problema, y así sucesivamente hasta que haya aislado la causa. –