speicherverbrauch steigt stätig....
-
Hi,
hab ein konsolenprogramm am laufen... (compiliert mit Qt4, reine windows bibliotheken..)
wenn man das startet liegt der speicherverbrauch bei 3MB, nach zwei Tagen bei 8Mb.. obs noch weiter steigt werd ich in einer Woche sehen...Aber: ist das normal? hab den purifyplus mal installiert.. speicherlecks scheint es keine zu geben...
und generell: wie kann ich den speicherverbrauch minimieren?
das programm frägt per http request eine datei von mehreren servern ab und speichert diese in eine mysql DB. außerdem gibts ne log datei die fehler speichert falls welche auftreten..
in der ausgabe ist nur zu sehen welche server gerade abgefragt werden... das ganze läuft als schleife unendlich... also abfrage von allen servern und 10min pause.. und dann wieder von vorne...
-
Hi
Speicher der Alloziert wurde freigeben - Handles alle wieder freigeben - Speicher von extern. libs freigeben. Sofern Funktionen vorhanden und nötig.
Vileicht erkennt dein Program einfach nicht alle memoryleack's. Oder du machst ein logischer Fehler.
Ansonnsten kann ich dir nicht viel mehr weiter helfen. Müsste da schon mal den Code sehen.lowbyte
-
nun.. der code hat 2000 zeilen... kann ich dir gerne per mail/pn schicken.. posten möchte ich den kompletten code hier nicht

EDIT: soweit seh ich auch keinen fehler.. z.b. wenn ich im mysql query was auslese gibts am ende ein mysql_free_result... die variablen an sich werden ja bei jedem durchlauf neu gesetzt (und ja der speicher so auch automatisch gelöscht ?)
wie ich jetzt speicher von externen libs freigebe weiß ich nicht.. wobei das programm ja dauerhaft läuft und diese libs auch brauch... also glaub ich ma kann ich den speicher ja gar nicht freigeben?
-
poste den code, 2000 zeilen sind doch nix
-
nagut
aber.. teile davon könnte man sicher nich simpler gestalten... und in OO natürlich noch besser...ist recht simpel der code...
edit. hab den source code rausgenommen, brauch ja nicht tagelang hier drin stehn ^^
-
vielleicht hilft noch folgendes:
wenn ich das programm maximiere (bzw. aus der taskleiste "heraushole", ist ja von anfang an minimiert)
und anschließend wieder minimiere beträgt der genutzte ram gerade mal 250kbyte... das ganze steigt dann wieder wie üblich...momentan über 12mbyte.. ich nehme an das steigt ins unendlich? müsste ich aber einfach mal probieren..
aber: meine vermutung ist einfach das die "ausgabe" soviel beansprucht... oder wie kann man sich erklären das wenn ich das programm wieder minimiere der speicherverbrauch wieder auf anfangstzustand (ca200kb) sinkt ?
-
3 MB, 8 MB, 12 MB, das sind alles Pimpifax-Werte, da kann man rein über den Task-Manager noch nicht sagen ob es ein Memory-Leak gibt oder nicht.
Kannst du das Programm so umbauen dass es mit 10-/100-/1000-facher Geschwindigkeit läuft? Ggf. einen lokalen Webserver zum Testen aufsetzen etc.
Dann würde der Speicherverbrauch - wenn es ein Leak gibt - schnell so deutlich ansteigen, dass du dir sicher sein kannst.
BTW: guck dir die "VM Size" ("Commit Size") an, und nicht die "(Private) Working Set Size". Das Working Set wird nämlich von Windows "gestutzt" wenn du das Programm minimierst, oder auch wenn andere Prozesse auf einmal viel Speicher brauchen.
-
Benutz doch libcurl. Das ist bereits mehrfach getestet worden.
-
Wenn der Speicher beim Minimieren freigegeben wird, aber dann wieder mit der Zeit beim minimierten Programm "wie üblich" steigt, dann kann das ja nicht die grafische Ausgabe sein, sondern da leckt Speicher, der beim Minimiervorgang aufgeräumt wird. Schau doch einfach nach, welche Ressourcen beim Minimieren freigegeben werden und ob die da sein sollen und nur fälschlicherweise geleert werden (z.B. Cache) oder dein Programm Leckt. Das kommt mir aber irgendwie seltsam vor.
Bei solchen Dingen hilft mir übrigens unter Linux manchmal "pmap -d" auf den Prozess, um den Übeltäter zu ermitteln. Das Windows-Pendant dazu kenne ich nicht, lässt sich aber bestimmt irgendwo finden.
-
Und vorallem sind 2000 Zeilen für so eine simple Aufgabe relativ wenig. Ich kann da echt nur raten, dass man vermehrt auf fertige Libs setzt. Dann wird das ganz schnell überschaubar und man schließt fehlerhafte Implementierungen eher aus.
-
.... schrieb:
Und vorallem sind 2000 Zeilen für so eine simple Aufgabe relativ wenig. Ich kann da echt nur raten, dass man vermehrt auf fertige Libs setzt. Dann wird das ganz schnell überschaubar und man schließt fehlerhafte Implementierungen eher aus.
Relativ viel!!!, war natürlich gemeint.
-
Mini schrieb:
Wenn der Speicher beim Minimieren freigegeben wird
Also ich tippe immer noch darauf dass garnix beim Minimieren freigegeben wird, sondern Windows einfach das Working Set beschneidet. Das hat mit Freigeben nix zu tun.
p.S.: es kann auch Speicher sein den Windows implizit verwendet, z.B. Texturen um das Fenster zu rendern oder etwas in der Art. Dann würde zwar wirklich was beim Minimieren freigegeben, aber nicht vom Programm selbst, sondern von einem Windows-Teil.
-
p.S.: es kann auch Speicher sein den Windows implizit verwendet, z.B. Texturen um das Fenster zu rendern oder etwas in der Art. Dann würde zwar wirklich was beim Minimieren freigegeben, aber nicht vom Programm selbst, sondern von einem Windows-Teil.
das klingt für mich am logischsten

Kannst du das Programm so umbauen dass es mit 10-/100-/1000-facher Geschwindigkeit läuft? Ggf. einen lokalen Webserver zum Testen aufsetzen etc.
ich werde das programm mal lokal testen und meinen server mit ner anfrage alle 1sex/1/10sec strapaziere.... also very extrem als so wie es momentan läuft...
BTW: guck dir die "VM Size" ("Commit Size") an, und nicht die "(Private) Working Set Size". Das Working Set wird nämlich von Windows "gestutzt" wenn du das Programm minimierst, oder auch wenn andere Prozesse auf einmal viel Speicher brauchen.
damit kann ich i.M nichts anfangen... was soll das sein?
btw... wer lust hat mal den kompletten source anzuschauen und seine meinung zu sagen kann sich gerne melden
würd mich echt mal interessieren was man zu meinem (seit 1 monat erst c gelernt)'m code so sagen würde...
apropo.. an ein speicherleck glaub ich momentant trotzdem nich... der code an sich schaut eigentl recht ok aus.. (bis auf das manches simpler gestaltet werden könnte
)
-
taurus schrieb:
BTW: guck dir die "VM Size" ("Commit Size") an, und nicht die "(Private) Working Set Size". Das Working Set wird nämlich von Windows "gestutzt" wenn du das Programm minimierst, oder auch wenn andere Prozesse auf einmal viel Speicher brauchen.
damit kann ich i.M nichts anfangen... was soll das sein?
die commit size ist die grösse des speichers den dein programm "belegt" hat.
die working set size ist die grösse des speichers den windows deinem programm momentan zugeteilt hat.die working set size kann daher viel geringer sein als die commit size, wenn windows z.b. (meist wenig genutzte) teile des belegten speichers auslagert.
beide werte kannst du dir mit dem windows 7 task manager angucken. wobei es sein kann dass du die "commit size" erst einblenden musst, ich glaube die wird per default nicht angezeigt.
-
dat geht so nisch... hab kein windows 7 arbeite noch mit winXP....
-
in windows xp heisst die spalte glaub ich "vm size".
-
Ansonsten ist ne passende Spalte bestimmt beim Process Explorer vorhanden

-
vm size wird wohl virtual memory site sein

nun.. Mem Usge liegt momentan bei 3,46MB die VM Size bei 5,74MB.
was sagen mir denn nun die angaben wenn vm size größer ist?
abgesehen davon:
im prozess manager kann ich ja auch version, firmen name, etc anzeigen.. wo genau werden diese angaben im programm gespeichert?
-
alter schwede
gibt es auch dinge die du selbst rausbekommen kannst?die versions-infos werden in einem "version" block in den sog. resourcen eine .exe/.dll datei abgespeichert.
-
ja und nein.. dazu hab ich nichts gefunden
was ist den nun mit der ram größe.. was sagt da denn aus?