Ich versuche, einige Speicherauslastungsprobleme zu beheben. Insgesamt sammelt meine Anwendung ein paar Datenwerte und visualisiert sie mit einem C1 WPF Charts und Datagrids schließlich alles in PDF-Berichte..NET-Prozessspeicherauslastung = 5x CLR-Heapspeicher?
Profilerstellung meines Prozesses mit YourKit Ich bin mit der Situation konfrontiert, dass die CLR-Heap-Größe ~ 120 MB ist (was alles in Ordnung ist), während die Prozessspeichergröße ~ 580 MB beträgt. Das ist fast 5-mal der Speicherverbrauch meiner tatsächlichen CLR-Heap-Größe. Meine CLR-Peak-Größe war 220 MB gegenüber 710 MB Prozessspeicherzuweisung.
Ich bin mir bewusst, dass einige Overhead auf meinem Objekt Haufen, Stapeln und so weiter erforderlich ist. In Java-JVMs war der typische Faktor, um den ich mich gekümmert habe, ~ 1,5x.
Wie kann dieser übermäßige Speicheraufwand erklärt werden? Ordnen die Prozesse nur freien freien Heapspeicher zu? Wenn ja, erklärt dies die 710 MB im Vergleich zu 220 MB?
Vielen Dank für Ihre wertvollen und ausführlichen Notizen. in Bezug auf die Anatomie und mögliche Probleme in Bezug auf .NET-Speicherzuweisung. In meinem Fall stellte sich schließlich heraus, dass es sich um die C1-Grafikkomponente handelte, die große Speicherblöcke über GDI + verwendete. Als Java-Experte war ich völlig verwirrt, dies mit .NET-Speicher-Profiler-Tools nicht sehen zu können. Schließlich mussten wir dieses Problem umgehen/lösen, indem wir die Verwendung dieser C1-Grafikkomponenten einschränken. –
Ich bin froh zu helfen. Ich musste viele Speicherauszüge mit WinDbg debuggen, was mir einiges beigebracht hat. Bei der Arbeit mit Komponenten von Drittanbietern behalte ich zwei Dinge im Auge: Erstens, vergewissere dich, dass sie entsorgt werden, und zweitens, behalte die Anzahl der Griffe im Auge, die deine App benutzt. Dies kann einfach getan werden, indem entweder TaskManager (stellen Sie sicher, dass die Handles-Spalte sichtbar ist) oder der SysInternals ProcessExplorer verwendet wird. Normalerweise würden Sie eine 'using()' Anweisung verwenden, um sicherzustellen, dass die Komponenten zeitgerecht entsorgt werden. Ich kenne WPF jedoch nicht, daher könnte das Framework schon dafür sorgen. –
Ben, wie hast du herausgefunden, dass der GDI + Speicher verbraucht hat? – RollRoll