Ram/Arbeitsspeicher belegung nimmt zu

ruNN0r

Erfahrenes Mitglied
Hallo, ich habe ein kleines Problem.
Ich habe ein Programm in C# .Net WindownsForms geschrieben dass meine E-Mail Accounts überwachen soll und mich über neue Mails informiert.

Ziel des ganzen war: Ein Tool zu besitzen dass Speichersparend und leicht zu bedienen ist. Da Thunderbird oder Outlook immer recht "viel" leistung brauchen und sich nicht richtig in den Hintergrund schieben lassen wollte ich ein Tool das einfach ein Icon bei der Uhr hat und ein alle x minuten mein Mails checkt. Lesen und abfragen kann ich diese dann ja über den richtigen Client.

Jedoch das mit dem Speichersparen ist so eine Sache ^^ Beim Start das Programms benötigt es ca. 9MB. Dann starten die ganzen abfragen der Postfächer. Dabei braucht der Thread für die Abfrage etwas CPU-Last. Danach schläft der Thread und wartet darauf, neue Abfragen machen zu dürfen. Jedoch ab diesem Moment fängt der Arbeitsspeicher immer mehr zuzunehmen. Es wird relativ schnell mehr und steigt auf ca. 17MB an, dort pendelt es sich erstmal ein. Über einen Tag hinweg sind es dann 19MB usw.
Ich kann mir das nicht so ganz erklären. Ich habe stark darauf geachtet Variabeln immer dann zu erstellen wenn ich sie brauche. Locale Variabeln sind nach beenden der Methode/Funktion eh wieder weg und "Globale" gibt es nur 6. Bei jedem neuen Objekt habe ich drauf geachtet immer ein Dispose zu machen. Die Verbindung zu dem Server nach der Abfrage zu beenden usw.

Meine Frage ist also, was könnte sonst noch dazu beitragen? Ich kann hier schlecht den ganzen Code schicken denn ich denke nicht dass jemand lust hat sich da ganz durchzukämpfen ;)

Ich danke euch!
 
Hallo ruNN0r

19MB an Speicherverbrauch finde ich jetzt nicht wirklich etwas was dir Gedanken machen sollte. Alleine schon die ganze CLR deren DLLs in deinen Prozess geladen werden brauchen einiges an Platz und sie werden in der Regel on demand geladen. Das heisst nach deinem ersten Durchlauf des Threads dürftest du einen ersten grossen Anstieg haben weil alle Abhängigkeiten in den Prozess geladen werden.

Grüsse
Muepe
 
achso. Ich hatte die befürchtung, dass es sich immer weiter aufbläht wenn es länger läuft weil ich irgendwo einen Fehler gemacht habe. Das wäre ja genau das gegenteil von dem was ich bezwecken wollte ^^

Ich werde es mal beobachten einfach mal ein paar Tage durchlaufen lassen. Aber das würde auf jeden fall den Anstieg am Anfang erklären.
 
Wenn du dir beim Programmieren schon Gedanken gemacht hast wie du den Speicherverbrauch optimieren kannst hast du in .NET eigentlich schon praktisch immer gewonnen, wirklich viel falsch kann man nur machen wenn man mit nativen Libraries kommuniziert, bzw native Resourcen verwendet.

Was du prüfen kannst ist ob du irgendwelche Collections hast in denen du immer wieder neues einfügst ohne jemals was zu entfernen. Hier kannst du den Thread auch einfach mal alle paar Millisekunden laufen lassen und schauen wie sich der Speicherverbrauch entwickelt.

Etwas weiteres was du tun kannst ist bei Visual Studio die Code Analysis durchlaufen lassen, da wird dir unter anderem angezeigt, wenn du bei einem Objekt das IDisposable implementiert Dispose nicht aufrufst.
 
Ich bin kein Profi, aber Grundregeln kenne ich. Glaube ich zumindest ^^
Und ja, Gedanken habe ich mir auf jeden fall gemacht.
Zu absatz 2:
Also für dieses doch rech kleine Tool habe ich eine Klasse "Settings" und eine List<Accounts> in denen ich die Accounts verwalte und die einstellungen. Sprich ServerDomain, Benutzername usw. Daten kommen während der Laufzeit wenige dazu oder werden entfernt. Ansonsten werden nur die Werte geändert wie z.B. Wie viele Mails sind vorhanden... Am ende wird das ganze Verschlüsselt in über XML in einer Datei gespeichert. Beim laden des Programms wird die Datei dann geladen, entschlüsselt und in die Classe gelegt. Die E-Mails selber werden nicht abgefragt oder gespeichert. Ich laden nur über Pop3 und dem Command: "STAT" die Anzahl und größe der Mails. Also sehe ich da keine Probleme und es gab auch keine Auffälligkeiten.

Ich habe das Tool nun mal von meinem letzen Post bis jetzt durchlaufen lassen und als ich den rechner verlassen habe lag das Tool bei 19MB. Heute morgen bei 17MB und vorhin nochmal bei 15MB... also scheid es nicht so wild zu sein, wie ich gedacht habe...

Den letzen Teil werde ich mir noch mal genauer ansehen. Ich weiß gar nicht wo ich sowas finde, oder wie ich das mache mit der Code Analysis. Aber danke für den Tipp ist bestimmt Praktrisch wenn man recht großen Code hat vergisst man gerne mal was.
 
Zurück