memory leaks - woher?

  • hallo

    hab mir ein kleines tool geschrieben mit dem ich verzeichnisstrukturen auf ein anderes spiegeln kann, also ein backup des baums machen kann.

    Das Problem ist dass sich aus irgendeinem grund der inaktive physikalische speicher immer weiter aufbläst und am schluss ca. 80% der gesicherten datenmenge ausmacht. Bei einem backup von 1,5Gb werden 1,2GB speicher inaktiv und werden auch nach beenden des Programmes vom os (os x 10.5.1) auch nicht wieder freigegeben. WTF? Das einzige wie ich mir das erklären könnte sind nicht geschlossene Streams, aber die schliesse ich alle brav.

    Hat wer eine idee was das verursachen könnte?

    Klasse die files kopiert:

    Klasse die rekursiv den verzeichnisbaum durchgeht

  • Ein System.exit(0) an Ende des Programms sollte dein Problem beheben. Alternativ kannst du auch versuchen, herauszufinden, welcher Thread die VM am Beenden hindert - Meine Vermutung ist, dass du ein Swing-GUI mit einem JFrame verwendest, dessen Default-Close-Operation nicht auf dispose gesetzt ist.

    "I don't think that Debian can really compete with Gentoo. Sure it might be okay, but when it comes to dependencies, you probably are still going to have to get them all on your own. Or is there something like portage in the Debian world as well?"

  • Seltsam. Der Speicher wird ja von der VM angefordert und ein System.exit beendet die VM in (fast) jedem Fall, also sollte der Speicher damit auch wieder freigegeben worden sein. Wie heißt denn der Prozess, der den Speicher angefordert hat? Evtl könntest du es doch noch mit einem explizitem System.exit versuchen?

    "I don't think that Debian can really compete with Gentoo. Sure it might be okay, but when it comes to dependencies, you probably are still going to have to get them all on your own. Or is there something like portage in the Debian world as well?"


  • hab mir ein kleines tool geschrieben mit dem ich verzeichnisstrukturen auf ein anderes spiegeln kann, also ein backup des baums machen kann.

    habe ich das richtig verstanden? du hast nach rund 35 jahren "cp" neu in java erfunden? ;) was kommt als naechstes? ein java-tool mit dem man verzeichnisse anlegen kann? ned boes gemeint :engel:

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Also Deinen Code habe ich nicht so genau angeschaut, aber wenn Du Verzeichnisse direkt kopieren möchtest, verwende doch einfach FileUtils#copyDirectory aus dem Apache Commons Projekt.

    http://commons.apache.org/io/api-release…20java.io.File)

    Was Dein MemoryLeak betrifft, rate ich dir folgendes: Versuche Den State deiner Objekte erstens klein zu halten und zweitens zu kapseln. Du greifst z.B. in Deinem Code oefters auf statische Attribute zu und veraenderst diese (z.b. all die Aufrufe auf BackupGUI). Das macht Deinen Code

    - nicht threadsafe, weil mehrere Threads in beliebiger Reihenfolge Werte veraendern koennen.

    - schwer ueberschaubar, weil man mitdenken muss, wie der Zustand von BackupGUI gerade ist.

    - anfaellig fuer Memoryleaks, weil der globale state nicht unbedingt geloescht wird.

    Das Du eine statische Methode BackupGUI.appendTextArea hast, laesst mich darauf schliessen, das Du auch eine statische TextArea hast. Schau dir am besten mal einfach an wie andere Swing GUIs schreiben, dann siehst Du wie es auch anders geht.

    Ich empfehle dir deine Software so zu designen, dass

    - du moeglichst wenig Methoden mit Seiteneffekten hast.

    - deine Objekte so wenig wie moeglich von einander wissen muessen.

    - deine Objekte nur den kleinstmoeglichen Zustand besitzen. Also im Prinzip so wenig Instanz und Klassenvariablen wie nur moeglich. Aussnahmen sind statische, final Variablen. Wenn Du Instanzvariablen hast, dann deklariere sie wenn moeglich als final.

    Dann entstehen naemlich solche Memoryleaks erst gar nicht. Und wenn doch, dann sind die schnell gefunden.

    PS: Von System.exit() sollte man wenn moeglich ganz die Finger lassen.

  • Warum nimmst du nicht einfach ein Tool


    Lasst den armen Beat doch sein Programm schreiben wenn er das will. Etwas Uebung hat noch niemanden geschadet(*).

    (*) Naja meistens jedenfalls. Hat sich sicher schon mal ein Shaolin Moench beim Ueben mit einem Nunchaku die Ruebe eingeschlagen. Aber selbst der hat dabei wahrscheinlich noch was gelernt.

  • Kann mir scho vorstellen dass ich die funktionalität auch mit cp hab, ich hab aber in meins schon zeit investiert und deswegen will ichs auch verwenden, was is so schwer daran zu verstehen.


    Du wirst mal ein exzellenter Softwareentwickler der alten Schule.

    Dipper dipper dii dipper dii dipper dii duuu

  • Du wirst mal ein exzellenter Softwareentwickler der alten Schule.


    hehe, so neumodernes hexenzeug wie "extreme programming" fangen wir uns gar nicht erst an. wenn schon zeit in ein projekt geflossen ist, dann ziehn wir das auch durch! ;)

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Vielleicht kannst du ja einmal den ganzen Code inklusive GUI posten, dann könnte mans auch nachvollziehen.

    Und zu den restlichen Kommentaren kann man nur sagen, dass durch das Verwenden von cp noch keiner gescheiter geworden ist (Macht sich auch in der Relevanz des Kommentarinhalts bemerkbar).

    "I don't think that Debian can really compete with Gentoo. Sure it might be okay, but when it comes to dependencies, you probably are still going to have to get them all on your own. Or is there something like portage in the Debian world as well?"

  • Ist doch völlig egal, warum er das will. So wie ich es verstanden habe, geht es hier nicht um ein Java memory leak, sondern er wundert sich einfach, dass nach der Beendigung des Programms der ganze Krempel, den er kopiert hat, im Cache liegt und daher notwendigerweise weniger Speicher frei ist als vorher. Das scheint ihn aus irgendeinem Grund zu stören. Aber da er sich ja so sicher ist, dass das nicht normal ist, habe ich auch keine Lust, ihm zu erklären, dass es das sehr wohl ist.

  • Zitat


    Aber da er sich ja so sicher ist, dass das nicht normal ist, habe ich auch keine Lust, ihm zu erklären, dass es das sehr wohl ist.

    Ich seh sowas nur zum ersten mal. Ich hatte erst letztens ein programm laufen dass mir 350GB Daten (~80000) files verarbeitet hat und das hat den inaktiven speicher überhaupt nicht aufgefüllt.

    Hier mal ein vorher und ein nachher bild von der aktivitätsanzeige. Der blaue inaktive teil der torte wird übrigends erst wieder freigegeben nachdem ich neu starte. Also normal kommt mir das nicht vor.

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!