Ich versuche, einige Speicherleckprobleme in einer Anwendung zu lösen, und ich hoffe wirklich, dass mir hier jemand Einsichten anbieten kann, die helfen werden. Ich habe den ganzen Tag damit herumgespielt und befürchte, dass ich komplett feststecke.
Die Anwendung, mit der ich Probleme habe, funktioniert anfangs einwandfrei, wird jedoch langsam und möglicherweise sogar abstürzen, wenn sie nach ein paar Stunden Inaktivität verwendet wird. Ich gehe davon aus, dass dies auf ein Art von Speicherleck zurückzuführen ist, das im Laufe der Zeit schlimmer wird. Soweit ich weiß, gibt es keine internen Prozesse, wie z. B. Timer oder endlose Schleifen usw., die das Speicherleck verursachen könnten, aber die Symptome sind reproduzierbar, also ist definitiv etwas im Gange.
Um das herauszufinden, habe ich eine Testversion von .NET Memory Profiler heruntergeladen und installiert. Leider bin ich mir jedoch nicht sicher, wie ich die Ergebnisse, die ich erhalte, interpretieren soll. Soweit ich erkennen kann, sind die Klassen, die für mich am problematischsten erscheinen, Systemklassen wie System.Version und System.Object[]. Ich gehe davon aus, dass der "Datensatz" die Anzahl der unerreichbaren Instanzen und Bytes ist, die vom Profiler gemeldet werden.
Hier sind einige Beispieldaten, ähnlich denen, die ich gesehen habe:
-
Namespace: System
- Klassenname: Version
- Lebende Instanzen...
- Insgesamt: 2
- Delta: 0
- Lebende Bytes...
- Insgesamt: 48
- Neu: 48
- Maximal: 24
- Delta: 0
- Unerreichbar...
- Instanzen: 15.556
- Bytes: 373.344
-
Namespace: System
- Klassenname: Object[]
- Lebende Instanzen...
- Insgesamt: 1.198
- Delta: 0
- Lebende Bytes...
- Insgesamt: 117.916
- Neu: 117.916
- Maximal: 7.016
- Delta: 0
- Unerreichbar...
- Instanzen: 3.054
- Bytes: 204.592
Wenn ich das richtig verstehe, sind die zwei größten Probleme, mit denen ich konfrontiert bin, dass ich über 15.000 Instanzen von Assemblyversionen und über 3.000 Objekte habe, die "unerreichbar" sind, obwohl ich zugeben muss, dass ich nicht genau weiß, was mit "unerreichbar" gemeint ist.
Also, meine spezifischen Fragen sind diese:
- Kann mir jemand sagen, ob ich die Daten des .Net Memory Profilers richtig interpretiere?
- Wenn ich die Daten richtig interpretiere, was könnte dazu führen, dass meine Anwendung mehr Assembly-Versioneninstanzen und mehr Objektinstanzen erzeugt, während kein Endbenutzer damit interagiert?