Programm frisst zuviel Speicher
-
Hallo,
ich wollte mal fragen, ob jemand weiß ob es eine möglichkeit gibt, [EDIT: zur laufzeit] festzustellen wann und wo ein Programm neuen Speicher anfordert.
Mir ist nämlich aufgefallen, dass mein Programm neuerdings vielzuviel Speicher frisst und ich nicht weiß woran es liegt. Ich kann leider nicht reproduzieren an welcher Codeänderung es liegt, da einiges passiert ist, seit ich mir die Speicherauslastung das letzte mal angeschaut habe. Ic vermute es sind Speicherlöcher, bin mir aber nicht sicher.
Ich verwende nebenher noch Qt 4.3.3 + OpenGL, für das Oberflächendesign und Grafikdarstellungen, könnte also auch daran liegen, würde ich aber erstmal ausschließen, das wäre bestimmt schon jemandem aufgefallen.
Seltsam ist, dass er Speicher aufbaut, wenn ich nur die Maus über das Widget zur Grafikdarstellung bewege. Weiterer seltsamer Punkt ist, wenn ich das Programm minimiere und danach wieder auf den Desktop hole, ist der Großteil des Speichers wieder frei, was vllt gegen Speicherlöcher meinerseits spricht (fällt von gut 640MB auf 15 MB).
Desweiteren hab ich erst vermutet es liegt am Debugmodus aber im Releasemodus sieht es ähnlich aus, benutze übrigens MSVS2008.
Wäre für Vorschläge dankbar.
Grüße
-
Operator new!?
-
ja den verwende ich bzw new[], mir gehts ehr darum das zur laufzeit festzustellen.
-
Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.
-
FreakyBKA schrieb:
..wenn ich das Programm minimiere und danach wieder auf den Desktop hole, ist der Großteil des Speichers wieder frei..
Du interpretierst das falsch. Ich gehe davon aus, dass du Windows und den Taskmanager verwendest. Unter "Speicherverbrauch" wird aber nur das "WorkingSetSize" der Anwendung angezeigt (aus der Struktur PROCESS_MEMORY_COUNTERS). Der tatsächliche Speicher ist der virtuelle Speicher udn kann im Taskmanager unter Ansicht->Spalten angezeigt werden.
640MB für eine Anwendung (oder ist es ein Spiel?) finde ich schon recht happig.
-
Oder man klinkt sich einfachs ins Speichermanagement ein. Für die CRT (C Runtime) von MSVC geht dies über
_CrtSetAllocHook.
Falls man auch noch die COM Speicherverwaltung prüfen möchte, dann geht dies überIMallocSpy.Gibt auch verschiedene fertige Tools im Internet dafür, welche aber meistens für das Entdecken von "Speicherlöcher" sind.
Aber mal eine andere Frage noch:
Wie hast du überhaupt festgestellt, wieviel Speicher verbraucht wird? Ich hoffe doch nicht, dass du dazu den Taskmanager verwendet hast?Grüssli
-
doch den hab ich verwendet, wie soll ich es denn sonst machen? als erster indikator kann man den doch nehmen oder etwa nicht?
-
Michael E. schrieb:
Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.
Genau so wie hier beschrieben, die Operatoren new und delete überschreiben. Somit weißt du immer wie viel Speicher deine Anwendung derzeit belegt.
-
FreakyBKA schrieb:
doch den hab ich verwendet, wie soll ich es denn sonst machen? als erster indikator kann man den doch nehmen oder etwa nicht?
So wie ich es geschrieben habe, das ist die zuverlässigste Methode unter Windows. Beim TaskManager hat noch das System selber seine Funktionen im Spiel. Was du siehst, ist der vom System dem Programm zugeordnete Speicher. Das Programm muss aber diesen Speicher gar nicht verwenden oder benötigen.
HighLigerBiMBam schrieb:
Michael E. schrieb:
Du kannst den Standard-"operator new" gegen einen eigenen austauschen. Dazu müsste in "Effektiv C++ programmieren" (1. Teil) was stehen. Damit kannst du Speicheranforderungen mitloggen.
Genau so wie hier beschrieben, die Operatoren new und delete überschreiben. Somit weißt du immer wie viel Speicher deine Anwendung derzeit belegt.
Nein, weiss er nicht.
operator newzu überladen heisst nur einen kleinen Teil des Speicherverbrauchs zu überwachen.Grüssli
-
Naja, wenn du operator new und operator new[] kontrollierst, bleibt an Speicheränderungen nur noch der Stack. Und auf diesem kann nicht in dieser Größenordnung reserviert werden.
-
Michael E. schrieb:
Naja, wenn du operator new und operator new[] kontrollierst, bleibt an Speicheränderungen nur noch der Stack. Und auf diesem kann nicht in dieser Größenordnung reserviert werden.
Ach und was ist mit
malloc? Oder meinst du niemand verwendetmalloc? Würde mich nicht erstaunen, wenn sogar Qtmallocverwendet. Wenn man den tatsächlichen Speicherverbrauch herausfinden will, muss man schliesslich alles prüfen. Es kann ja sein, dass man einen legalen hohen Speicherverbrauch hat, weil man irgendwo eine Bibliothek zu massiv oder falsch einsetzt. Du weisst nicht, wie diese Bibliothek den Speicherverbrauch verwaltet. Du kannst mit der Überladung vonoperator newnicht mal auf deren Speicherverbrauch zugreifen, da dies nicht über Bibliotheksgrenzen geht.Grüssli
-
Stimmt.
-
sorry, dass ich das jetzt nach 2 wochen noch einmal rauskrame. aber ich habe jetzt herausgefunden, dass mein programm jedesmal 8KB mehr speicher zugewiesen bekommt (Taskmanager), wenn ich die cosf bzw sinf funktion aufrufe, die standardmäßig dabei sind.
kann mir jemand sagen woran das liegt, denn darin liegt dann wahrscheinlich die ursache für mein speicherproblem, da ich sehr viel mit cos und sin-aufrufen arbeite.