Hallo liebe Leute,
ich habe ein Problem. Ich schreibe ein Programm dass rekursiv durch Linux Verzeichnisse läuft und alle Dateien öffnet, jede Zeile einliest, prüft ob ein gewisser String enthalten ist und den Reader dann wieder schliesst.
Ich bekomme obwohl ich sogar mit -Xmx2500m den Speicher erhöht habe irgendwann einen Heap Space Error.
Hier habe ich den verantwortlichen Teil des Codes. (das Programm gelangt rekursiv an jedes File im Linux System und führt auf jedes File diesen Code aus.
Ich dachte eigentlich dass ich nur immer eine Referenz auf einen Reader und eine Zeile im Speicher habe. Der Rest müsste doch immer freigegeben werden durch den Garbage Collector. Oder liegt es daran , dass manche Dateien, ewig lange Zeilen haben, bzw der Reader in ihnen keinen Zeilenumbruch erkennt? Aber 2,5GB????
Vielleicht erkennt jemand von euch das Problem.
Falls die Exception von Bedeutung ist:
Edit: Es hat nichts damit zutun, dass ich vielleicht matches zu groß werden lasse.
Wenn ich ein System.out.println(); in die if-Bedingung mit rein nehme, wird diese sogut wie nie erreicht, (2mal) da ich einen sehr seltenen String suche
Edit2: Könnte es sein, dass ich zu viele Strings anlege? Strings sind ja unveränderlich und es wird mit jeder Zeile ein neues Stringobjekt im Pool gehalten oder? Bleiben diese Strings solange erhalten wie das Programm läuft? Könnte das die Ursache sein?
Vielen Dank für eure Hilfe
Gruß Helmut
ich habe ein Problem. Ich schreibe ein Programm dass rekursiv durch Linux Verzeichnisse läuft und alle Dateien öffnet, jede Zeile einliest, prüft ob ein gewisser String enthalten ist und den Reader dann wieder schliesst.
Ich bekomme obwohl ich sogar mit -Xmx2500m den Speicher erhöht habe irgendwann einen Heap Space Error.
Hier habe ich den verantwortlichen Teil des Codes. (das Programm gelangt rekursiv an jedes File im Linux System und führt auf jedes File diesen Code aus.
Java:
if(files[i].isFile()){
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(files[i]));
String line;
while ((line = reader.readLine()) != null) {
if(line.contains(find)){
matches.add(files[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Ich dachte eigentlich dass ich nur immer eine Referenz auf einen Reader und eine Zeile im Speicher habe. Der Rest müsste doch immer freigegeben werden durch den Garbage Collector. Oder liegt es daran , dass manche Dateien, ewig lange Zeilen haben, bzw der Reader in ihnen keinen Zeilenumbruch erkennt? Aber 2,5GB????
Vielleicht erkennt jemand von euch das Problem.
Falls die Exception von Bedeutung ist:
Code:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535)
at java.lang.StringBuffer.append(StringBuffer.java:322)
at java.io.BufferedReader.readLine(BufferedReader.java:363)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at SecureFileSearcherStarter.searchFile(SecureFileSearcherStarter.java:84)
at SecureFileSearcherStarter.main(SecureFileSearcherStarter.java:22)
Edit: Es hat nichts damit zutun, dass ich vielleicht matches zu groß werden lasse.
Wenn ich ein System.out.println(); in die if-Bedingung mit rein nehme, wird diese sogut wie nie erreicht, (2mal) da ich einen sehr seltenen String suche
Edit2: Könnte es sein, dass ich zu viele Strings anlege? Strings sind ja unveränderlich und es wird mit jeder Zeile ein neues Stringobjekt im Pool gehalten oder? Bleiben diese Strings solange erhalten wie das Programm läuft? Könnte das die Ursache sein?
Vielen Dank für eure Hilfe
Gruß Helmut
Zuletzt bearbeitet: