Hallo zusammen,
mir läuft der Heap Space voll, ich komme aber nicht auf die Ursache des Problems.
Ich beschreibe mal was mein Programm macht:
Allgemeine Infos:
- Das Programm analysiert die Logdateien eines Lasttestlaufs und schreibt verschiedene Daten wie IDs und natürlich vorallem die Laufzeit in eine CSV Datei.
- Eine Logdatei ist so aufgebaut, dass sie unter anderem Zeilen wie "Starte Versand..." und "Erhalte Antwort..." neben jede Menge anderen Logeinträgen enthält.
- Stündlich wird eine neue Logdatei geschrieben, somit teilt sich ein Testlauf auf mehrere Logdateien auf.
Ablauf des Programms:
1. Einlesen der ersten Logdatei. Dabei werden alle Zeilen, die die Schlüsselworte "Starte Versand..." und "Erhalte Antwort..." enthalten in ein String-Array geschrieben.
2. Aufruf einer Methode, die dieses Array auswertet, d. h. aus jeweils einem Start- und dem passenden Antwort-Eintrag wird eine Zeile für die CSV Datei zusammengebastelt.
2.1 Löschen der beiden gerade bearbeiteten Einträge aus dem Array. Dies habe ich gemacht, weil ich dachte, dass dieses Array für den Speicherüberlauf verantwortlich ist. Leider hat das nichts gebracht.
3. Einlesen der nächsten Logdatei, usw.
Ich habe mal eine Ausgabe eingebaut, die nach jeder analysierten Logdatei erzeugt wird und die mir den verbleibenden Speicherplatz anzeigt (Runtime.getRuntime().freeMemory()). Dabei sehe ich, dass jedes mal ca. 60-80Mb flöten gehen. (Die Logdateien sind übrigens ca. 40Mb groß)
Mir fehlt jetzt wohl das tiefere Verständnis vom Speichermanagement von Java. Bis jetzt war ich mit der Info ganz gut bedient, dass der garbage collector den Speicher wieder aufräumt sobald man die Zeiger auf die jeweiligen Objekte entfernt.
Mache ich das nicht, wenn ich per remove die Einträge aus dem Array entferne?
Gibt es sonst noch irgendwelche Java-typischen Speicherfallen in die man reintreten kann?
Wo ich mir noch nicht sicher war ist der bufferedWriter bzw. bufferedReader. Hier habe ich sicherheitshalber ein flush (writer) eingebaut und den reader "close" ich sobald ich ihn nicht mehr benötige. Aber brauchen bufferedWriter/Reader überhaupt viel Speicherplatz?
Sonst fällt mir überhaupt nicht mehr ein, wo mein Speicherfresser versteckt sein könnte.
Hoffe, dass mir da wer einen Tipp geben kann.
Schönen Gruß
oetzi
PS: Habe den Heapspace schon auf max. 1 Gb erhöht. Das reicht aktuell bei weitem nicht.
mir läuft der Heap Space voll, ich komme aber nicht auf die Ursache des Problems.
Ich beschreibe mal was mein Programm macht:
Allgemeine Infos:
- Das Programm analysiert die Logdateien eines Lasttestlaufs und schreibt verschiedene Daten wie IDs und natürlich vorallem die Laufzeit in eine CSV Datei.
- Eine Logdatei ist so aufgebaut, dass sie unter anderem Zeilen wie "Starte Versand..." und "Erhalte Antwort..." neben jede Menge anderen Logeinträgen enthält.
- Stündlich wird eine neue Logdatei geschrieben, somit teilt sich ein Testlauf auf mehrere Logdateien auf.
Ablauf des Programms:
1. Einlesen der ersten Logdatei. Dabei werden alle Zeilen, die die Schlüsselworte "Starte Versand..." und "Erhalte Antwort..." enthalten in ein String-Array geschrieben.
2. Aufruf einer Methode, die dieses Array auswertet, d. h. aus jeweils einem Start- und dem passenden Antwort-Eintrag wird eine Zeile für die CSV Datei zusammengebastelt.
2.1 Löschen der beiden gerade bearbeiteten Einträge aus dem Array. Dies habe ich gemacht, weil ich dachte, dass dieses Array für den Speicherüberlauf verantwortlich ist. Leider hat das nichts gebracht.
3. Einlesen der nächsten Logdatei, usw.
Ich habe mal eine Ausgabe eingebaut, die nach jeder analysierten Logdatei erzeugt wird und die mir den verbleibenden Speicherplatz anzeigt (Runtime.getRuntime().freeMemory()). Dabei sehe ich, dass jedes mal ca. 60-80Mb flöten gehen. (Die Logdateien sind übrigens ca. 40Mb groß)
Mir fehlt jetzt wohl das tiefere Verständnis vom Speichermanagement von Java. Bis jetzt war ich mit der Info ganz gut bedient, dass der garbage collector den Speicher wieder aufräumt sobald man die Zeiger auf die jeweiligen Objekte entfernt.
Mache ich das nicht, wenn ich per remove die Einträge aus dem Array entferne?
Gibt es sonst noch irgendwelche Java-typischen Speicherfallen in die man reintreten kann?
Wo ich mir noch nicht sicher war ist der bufferedWriter bzw. bufferedReader. Hier habe ich sicherheitshalber ein flush (writer) eingebaut und den reader "close" ich sobald ich ihn nicht mehr benötige. Aber brauchen bufferedWriter/Reader überhaupt viel Speicherplatz?
Sonst fällt mir überhaupt nicht mehr ein, wo mein Speicherfresser versteckt sein könnte.
Hoffe, dass mir da wer einen Tipp geben kann.
Schönen Gruß
oetzi
PS: Habe den Heapspace schon auf max. 1 Gb erhöht. Das reicht aktuell bei weitem nicht.