Arbeitsspeicher wird langsam voll

Dieses Thema Arbeitsspeicher wird langsam voll im Forum "Allgemeine Java-Themen" wurde erstellt von kjg101, 1. Dez. 2016.

Thema: Arbeitsspeicher wird langsam voll Hallo, ich programmiere in Eclipse mit Java. Heute ist mir einmal passiert, dass das Betriebssystem mir dazu...

  1. Hallo,

    ich programmiere in Eclipse mit Java. Heute ist mir einmal passiert, dass das Betriebssystem mir dazu geraten hat, Eclipse zu schließen, da Java zu viel Arbeitsspeicher verbraucht.

    Ich hatte ein Programm oft hintereinander getestet. Mit jedem Durchlauf wurde der freie Arbeitsspeicher weniger. Hat jemand eine Idee, woran das liegen könnte?

    Insgesamt hat übrigens mein Computer genug Arbeitsspeicher (8 GB). Mit jedem Programmdurchlauf (nach c.a. 300ms ohne Fehler beendet) sinkt der freie Arbeitsspeicher um c.a. 200MB.

    Danke im Voraus!
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Moin,
    Ohne Infos eher nicht :rolleyes:

    Das Problem selbst nennt sich "Speicherleck" (oder "Memoryleak"), google mal danach :)

    Gruß Klaus
     
  4. Sicher, dass der Programmdurchlauf wirklich beendet wird? Oder startest du den Prozess vielleicht mehrmals? Ansonsten haben wir, wie Vfl_Freak bereits schrieb, zu wenig Infos was bspw. dein Programm macht.
     
  5. Hallo,

    danke schon mal für die Antworten. Das ganze Programm ist zu lang, um es hier reinzustellen. Hier aber mal ein paar relevante Auszüge:

    Code (Java):

    import java.util.ArrayList;
    import ij.IJ;
    import ij.ImagePlus;
    import ij.WindowManager;

    static double[][] averagePixels;
    static double[][] covarianceMatrix;
    static double[] x0;
    static double[] x1;
    static int d, Nx, Ny, N;
    ...
    public static void main(String[] args)
    {
         IJ.open();
         ImagePlus img = WindowManager.getCurrentImage();
         final long timeStart = System.currentTimeMillis();
         ArrayList<ImagePlus> images = new ArrayList<ImagePlus>();
         images.add(img);
         calculateAveragePixels(images);
         calculateCovarianceMatrix();
       
         final long timeEnd = System.currentTimeMillis();
         System.out.println("Finished ("+(timeEnd-timeStart)+"ms)");
    }
     
    Ausgabe: Finished (83ms).

    Das Programm arbeitet mit Bildern, also mit größeren Datenmengen. Dazu nutze ich u.a. auch die Bibliothek ImageJ. In der main-Funktion werden verschiedene Funktionen aufgerufen, die Algorithmen implementieren und die anfangs leeren globalen Variablen initialisieren/verwenden. Mich wundert es auch nicht, dass während der Laufzeit eine Menge Arbeitsspeicher benötigt wird. Mich wundert es nur, dass er nicht wieder freigegeben wird (bzw. erst wenn ich Eclipse schließe).
     
  6. Joose
    Joose Mitarbeiter
    Werden von deinen Programm weitere Threads gestartet (oder vielleicht startet eine Bibliothekt die du verwendest welche)? Wenn ja werden diese korrekt beendet?
     
  7. Einfach nach dem "Beenden" deines Programmes mal im Taskmanager nachsehen wieviele java.exe denn nun laufen ?!
     
  8. Es wird tatsächlich bei jedem Start des Programms ein neuer Prozess java.exe gestartet, und es liegt an der Bibliothek ImageJ, die am Ende des Programmes noch offen ist. Danke für eure Hilfe. Dann weiß ich, wonach ich schauen muss.
     
    JStein52 gefällt das.
  9. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!