Speicherverbrauch frage



  • Gleiches BS, identische SW,
    @drakon: wieso wird aufgrund anderer Prozesse meinem Prozess mehr Speicher zugeordnet? Könnte ich ein Stichwort haben nach dem ich googlen kann?



  • MBreuer schrieb:

    Woran kann der zusätzliche Speicherbedarf liegen ?

    Schwierig zu sagen, wenn man weder das OS noch das Programm kennt. Du hast auch nicht gesagt, wie du den Speicherbedarf gemessen hast.

    Aber man kann natürlich raten. Ich rate mal, dass du im Windows-Taskmanager die Spalte "Speicherauslastung" abliest und das dann als reinen Speicherbedarf für dein Programm interpretierst. Tatsächlich sagt der Wert aber nur aus, wie viel Speicher das System im Moment für den Prozess reserviert hat, und nicht wie viel Speicher tatsächlich angefordert wurde.
    Wie viel Speicher deinem Prozess zugewiesen wird, entscheidet das OS, und zwar abhängig davon, wie viel Speicher im Rechner steckt und was sonst noch so auf dem Rechner los ist.



  • richtig getippt, Windows

    Tatsächlich sagt der Wert aber nur aus, wie viel Speicher das System im Moment für den Prozess reserviert hat, und nicht wie viel Speicher tatsächlich angefordert wurde.

    Das glaube ich gern, aber der Prozess wird denke ich mehr benötigen als vorher, sonst würde doch kein zusätzlicher Speicher angefordert oder irre ich ?

    Zudem ist die Frage wenn der Prozess nicht mehr Speicher benötigt wieso wird ihm vom OS mehr gegeben ?



  • Weil das OS die verfügbaren Ressourcen so aufteilt, dass bestmögliche Performance erzielt wird.
    Für Details fragst du besser jemanden, der sich mit Windows auskennt. Mit C++ hat das jedenfalls nichts zu tun.



  • MBreuer schrieb:

    Gleiches BS, identische SW,
    @drakon: wieso wird aufgrund anderer Prozesse meinem Prozess mehr Speicher zugeordnet? Könnte ich ein Stichwort haben nach dem ich googlen kann?

    Da habe ich wohl was falsch verstanden. Ich dachte, dass du gesamthaft mehr Speicher brauchst.

    Wie sieht denn das Verhalten aus? Steigt beim einen Computer der Speicher ständig an bis der Ram voll ist, oder wird das vlt. später wieder weniger oder hat er irgendwann einen konstanten Wert erreicht?



  • Ich habe beide Rechner gestartet,
    bei beiden ist der Speicherbedarf nach 2 Minuten 4030464,
    nach einer Stunde hat der eine immer noch diesen Wert der andere (Rechner 2) knapp 40000 mehr.
    Danach verläuft der Bedard einige Stunden parallel (also bei beiden keine Veränderung), noch später sinkt der Verbrauch den ersten Rechners und bleibt stabil, der Bedarf des Rechners 2 steigt nocheinmal und beleibt dann stabil (solange ich getestet habe, d.h. Gesamttestdauer 13 Stunden)



  • mal ne Frage:
    Hast du irgendwie Bedenken dass dein Speicher nicht ausreichen könnte? Ist das wirklich wichtig, ob dein Programm jetzt 40k mehr oder weniger Speicher braucht?

    Falls ja, dann nehme ich mal an dass deine Zielplattform nicht Windows sondern irgendwas kleines ist, und dann solltest du dein Programm für die Zielplattform compilieren und dort laufen lassen und dort auch den Speicherverbrauch messen, und das grundsätzlich mit etwas verlässlicheren Tools als einem Windows Task Manager.
    Falls nein, kannst du das beobachtete Verhalten getrost als Geheimnis von Windows abhaken. Das ist nämlich ziemlich müßig da ins Blaue zu raten woran das liegen könnte. Widme dich dann doch lieber lohnenderen Aufgaben 😉



  • @pumuckl: Ich bin auf der Suche nach Memoryleaks, kann das Verhalten aber schlecht reproduzieren. Ich habe einmal wachsenden Speicherbedarf beobachtet. Nach mehreren weiteren Versuchen kann ich Speicherlöcher aber ziemlich sicher ausschliessen.

    Ja ich befürchte das der Speicher nicht reicht, und will wissen ob ich selbst durch dieses Programm oder sonstige Einstellungen etwas dazu beigetragen habe, oder ob ich durch äußere Maßnahmen solche Verhaltensweisen beeinflussen kann.

    Wieso verhält sich Windows in (ich behaupte mal vorsichtig) ähnlichen Umgebungen verschieden ?
    Der Speicherverbrauch für diesen Prozess wird von einem anderen Programm in ein Logfile geschrieben, die Daten sind allerdings die gleichen die der Taskmanager auch angibt.

    Aus deinem Post lese ich einige Angaben die den Sinn meines Anliegens in Frage stellen, warum?
    Weder meine noch die Zeit der hier Unterstützenden möchte ich ziellos belasten.

    Das Programm wird unter XP entwickelt und unter embedded eingesetzt.
    Die embedded Images sind die gleichen und ich mache mir schon Gedanken warum solches Verhalten auftritt.

    Es gibt überall Leute die noch irgendeinen Tipp oder Trick auf Lager haben, von dem ich gut lernen kann, deshalb möchte ich das Problem zunächst nicht einfach so als gegeben hinnehmen.


  • Administrator

    MBreuer schrieb:

    Ich bin auf der Suche nach Memoryleaks, kann das Verhalten aber schlecht reproduzieren. Ich habe einmal wachsenden Speicherbedarf beobachtet. Nach mehreren weiteren Versuchen kann ich Speicherlöcher aber ziemlich sicher ausschliessen.

    Memory Leaks findet man aber nicht so, sondern verwendet entsprechende Tools. Unter VS kann man sich relativ leicht sogar selber was zusammenbasteln. Ein paar Links dazu:
    http://blog.m-ri.de/index.php/2008/10/27/vs-tipps-tricks-heap-bugs-finden-teil-1/
    http://msdn.microsoft.com/en-us/library/974tc9t1.aspx
    http://msdn.microsoft.com/en-us/library/e5ewb1h3.aspx
    http://msdn.microsoft.com/en-us/library/cy8c7wz5.aspx

    Gibt auf Codeproject auch kleine Bibliotheken.

    Grüssli



  • MBreuer schrieb:

    @pumuckl: Ich bin auf der Suche nach Memoryleaks, kann das Verhalten aber schlecht reproduzieren. Ich habe einmal wachsenden Speicherbedarf beobachtet. Nach mehreren weiteren Versuchen kann ich Speicherlöcher aber ziemlich sicher ausschliessen.

    Hättest du uns gleich gesagt dass es dir um Memory-Leaks geht, hätte dir auch gleich gesagt werden können dass du die mit einem Windows Task Manager nicht findest. Denn mit dem kannst du allerhöchstens das sehen was du uns berichtet hast: Du siehst, dass da scheinbar vielleicht etwas passiert. Du siehst aber nicht, ob da wirklich was passiert, du siehst nicht, was da passiert, wo es genau passiert udn warum es passiert. Um deinen Code auf Speicherlecks zu überprüfen gibts extra Tools, wie z.B. memcheck, valgrind, uvw.

    Wieso verhält sich Windows in (ich behaupte mal vorsichtig) ähnlichen Umgebungen verschieden ?

    Weil Windows eine große und komplexe Box ist, bei der kleine Unterschiede große Wirkungen haben können. Obwohl ich einen Unterschied von ca. 1% im Speicherverbrauch (40kB mehr auf 4MB) jetzt nicht als so große Wirkung empfinde.

    Aus deinem Post lese ich einige Angaben die den Sinn meines Anliegens in Frage stellen, warum?

    Den Sinn stelle ich nicht in Frage, zumindest nicht unter der Voraussetzung dass du für ein Embedded-System entwickelst, was ich aber vorher nicht wusste. Es gibt hier immer wieder Leute die für ihren PC mit 3 GB Hauptspeicher entwickeln und sich einen abbrechen um an einer ungeeigneten Stelle 40 Byte einzusparen. Die Frage diente also auch dazu um deine bis dahin etwas vagen Auskünfte etwas zu ergänzen und herauszufinden ob dein Problem tatsächlich eines ist - wovon man eben nicht immer ausgehen kann.

    Das Programm wird unter XP entwickelt und unter embedded eingesetzt.
    Die embedded Images sind die gleichen und ich mache mir schon Gedanken warum solches Verhalten auftritt.

    Die Frage ist, ob das Verhalten auch auf dem Embedded-System auftritt. Das Speichermanagement dort ist mit Sicherheit ein ganz anderes als das von Windows auf einem PC mit mehreren GB Speicher. Daher solltest du soetwas immer auf dem Zielsystem testen oder einem geeigneten Emulator.

    Es gibt überall Leute die noch irgendeinen Tipp oder Trick auf Lager haben, von dem ich gut lernen kann, deshalb möchte ich das Problem zunächst nicht einfach so als gegeben hinnehmen.

    Das ist klar, die Leute sind ja auch zum Tipgeben hier. Man möchte allerdings auch erstmal abgrenzen ob es sich lohnt, sich mit deinem Problem zu beschäftigen und die nötigen Informationen sammeln. Das war Ziel der Frage. Und der Tip zu dem Problem war eben: Der Windows Task Manager ist ein zu grobschlächtiges Instrument um dir verwertbare INformationen zum Speicherverhalten deine Anwendung zu geben (unabhängig vom Zielsystem, aber insbesondere wenns nicht für Windows-PC geschrieben ist).



  • Ich hab mir schon gedacht das ich mit der Memoryleak Vokabel das Thema vielleicht in die falsche Richtung lenke, daher habe ich das Wort erstmal weggelassen. - Vielleicht war es ja auch ein Fehler es zu vermeiden und das Problem liegt darin begründet dann ist es gut das ihr nachgebohrt habt.

    @Dravere: danke die in MartinsBlog erklärten Mechanismen nutze ich bereits, zusätzlich nutze ich noch ein weiteres Tool von Jochen Kalmbach.

    Auf dem Entwicklungsrechner habe ich kein Problem festgestellt, auf dem Zielrechner ist das Verhalten nicht konstant reproduzierbar. Es gab mal geloggten erhöhten Speicherbedarf (die Angaben ähnlich dem Taskmanager), das muss aber kein leak sein da ich den Code nicht groß verändert habe und mit den anderen o.G. Mitteln kein leak festgestellt habe.

    Weiterer Unterschied war der unterschiedliche Verbrauch.

    Ich habe die Möglichkeit auf dem Zielsystem mit Remotedebugging draufzugehen.
    Das Programm hat eine while (!ende) - Schleife,
    in der fast nichts geschieht. Ich kann mit Breakpoint ende==true setzen, dann wird das Programm verlassen...
    - ohne geloggte Speicherlöcher, daher würde ich sie mit ziemlicher Sicherheit ausschliessen. (@pumuckl)

    Ich mache einen längeren Test auf den zwei embedded-Systemen, werde mitteilen war er ergab.

    Auch wenns beim einem PC nicht groß auffällt ist es doch trotzdem komisch wenn er mehr Speicher für die gleiche Aufgabe braucht als sein Kumpel. Die Embedded-Systeme sind gleich, verhalten sich jedoch verschieden.

    Die Frage ist auch warum der Speicherbedarf zwischenzeitlich steigt, und dann wieder sinkt obwohl im Programm nix spannendes getan wird.
    Vielleicht habe ich mich ja auch verschätzt und das "Einschwingen" ist nicht nach 2 Minuten sondern erst nach 10 Stunden oder noch mehr geschehen, selbst wenn die Schleife nach 2 Minuten schon einige Zeit läuft.
    Wie erwähnt die Schleife läuft, nichts ändert sich und auf einmal braucht der kleine Nascher mehr Speicher. Rückts aber wieder heraus am Ende.
    Nur... wenn das Programm lange genug läuft vielleicht kommt er ja auf den Appetit und will mehr und spuckts nicht wieder aus ?
    Deshalb möchte ich gern mehr erfahren.



  • Hier noch ergänzend die Ergebnisse Rechner D und Rechner S:
    _______D_______S
    1 4255744 4149248
    2 4255744 4157440
    3 4255744 4157440
    4 4329472 4202496
    5 4329472 4202496
    6 4325376 4202496
    7 4325376 4202496
    8 4325376 4202496
    9 4325376 4202496
    10 4325376 4202496
    11 4325376 4202496
    12 4321280 4202496
    13 4321280 4202496
    14 4321280 4202496
    15 4313088 4202496
    16 4308992 4202496
    17 4308992 4202496
    18 4308992 4202496
    19 4308992 4202496
    20 4308992 4202496
    21 4308992 4202496
    22 4308992 4202496
    23 4308992 4202496
    24 4308992 4202496
    25 4308992 4202496
    26 4308992 4202496
    27 4308992 4202496
    28 4308992 4202496
    29 4308992 4202496
    30 4308992 4202496
    31 4308992 4202496
    32 4308992 4202496
    33 4308992 4202496
    34 4308992 4202496
    35 4308992 4202496
    36 4308992 4202496
    37 4308992 4202496
    38 4308992 4202496
    39 4308992 4202496
    40 4308992 4202496
    41 4308992 4202496
    42 4308992 4202496
    43 4308992 4202496
    44 4308992 4202496
    45 4308992 4202496
    46 4308992 4202496

    EDIT: format der Tabelle



  • Welche Datenstrukturen verwendest du denn?
    Listen? Ques? Vektoren?
    Werden die Objekte an sich oder nur Pointer darin gespeichert?
    Werden in der Schleife noch Objekte erstellt und gelöscht?

    bb


Anmelden zum Antworten