Mein Programm, leider, hat ein Speicherleck irgendwo, aber ich werde verdammt sein, wenn ich weiß, was es ist.Strategien zum Aufspüren von Speicherlecks, wenn Sie alles falsch gemacht haben
Seine Aufgabe ist es, in einem Haufen von ~ 2MB-Dateien zu lesen, einige Parsing und String-Ersetzung durchzuführen, dann geben Sie sie in verschiedenen Formaten. Das bedeutet natürlich eine Menge Strings, und so zeigt das Memory-Tracing, dass ich viele Strings habe, was genau das ist, was ich erwarten würde. Die Struktur des Programms besteht aus einer Reihe von Klassen (jeweils in einem eigenen Thread, da ich ein Idiot bin), der auf ein Objekt wirkt, das jede Datei im Speicher darstellt. (Jedes Objekt hat eine Eingabewarteschlange, die an beiden Enden eine Sperre verwendet. Während dies bedeutet, dass ich diese einfache Verarbeitung parallel ausführen muss, bedeutet dies auch, dass ich mehrere 2MB-Objekte im Speicher habe.) Die Struktur jedes Objekts wird durch ein Schemaobjekt definiert .
Meine Verarbeitungsklassen lösen Ereignisse aus, wenn sie ihre Verarbeitung ausgeführt haben, und übergeben einen Verweis auf das große Objekt, das alle meine Zeichenfolgen enthält, um es der nächsten Verarbeitungsobjektwarteschlange hinzuzufügen. Wenn das Ereignis durch einen Funktionsaufruf ersetzt wird, der zur Warteschlange hinzugefügt wird, wird das Leck nicht gestoppt. Eines der Ausgabeformate erfordert, dass ich ein nicht verwaltetes Objekt verwende. Das Implementieren von Dispose() für die Klasse stoppt das Leck nicht. Ich habe alle Verweise auf das Schemaobjekt durch einen Indexnamen ersetzt. Kein Würfel. Ich habe keine Ahnung, was das verursacht, und keine Ahnung, wo ich hinschauen soll. Der Speicher-Trace hilft nicht, da alles, was ich sehe, eine Menge von Strings ist, die erzeugt werden, und ich sehe nicht, wo die Referenzen im Speicher stecken bleiben.
Wir werden ziemlich aufgeben und an dieser Stelle zurückrollen, aber ich habe ein pathologisches Bedürfnis, genau zu wissen, wie ich das vermasselt habe. Ich weiß, dass Stack Overflow meinen Code nicht genau durchkämmen kann, aber welche Strategien können Sie vorschlagen, um dieses Leck nachzuverfolgen? Ich werde das wahrscheinlich zu meiner Zeit machen, also ist jeder Ansatz machbar.
+1 Ich nenne das "binäre Suche", weil ich die Hälfte des Codes deaktivieren und testen, ob das Problem noch besteht. Wiederholen Sie mit der anderen Hälfte. Angenommen, ich bekomme konsistente Ergebnisse, kann ich jetzt die Hälfte der Hälfte, die das Problem enthält, deaktivieren, bis ich die Ursache isoliert habe. –