Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

Problem mit garbage collecor in java

MRPSV1 / 5 Antworten / Flachansicht Nickles

Hallo Leute
Ich habe ein Programm geschrieben mit dem man im Netzwerk ganz einfach Dateien austauschen kann. So bisher funktioniert das Programm super, es tauscht die Dateien aus, egal welches Format und sie sind auch am ende immer noch ausführbar und so. Ich ich lese die Dateien in ein byte array ein, was 1mb groß is und sende dieses Array über dem Stream raus. Aber jedes mal wenn er den nächsten mb aus der Datei lesen soll erstellt es das byte array in einer Schleife mit new byte neu und das Array mit dem vorherigen mb aus der Datei bleibt im Arbeitsspeicher vorhanden und lässt sich mit dem garbage collector auch nicht entfernen. wenn ich z.B. eine Datei sende die 20mb groß ist steigt der Arbeitsspeicher verbrauch meines Programms während des sendens und bleibt so groß. Wenn ich dann auch diese Datei nochmal senden würde hält das Programm während des sendens an und ich bekomme einen Fehler ausgegeben das der Heapspace voll ist. was muss ich tun um die gesendete Datei wieder aus dem Arbeitsspeicher wieder gelöscht wird?? auch System.gc(); nützt nichts.

Danke schonmal im vorraus.

bei Antwort benachrichtigen
MRPSV1 Borlander „Warum erstellst Du das Array denn überhaupt neu? Bzw.: Die Elementaren...“
Optionen

Ja aber das musste ich so schreiben, den sonst sendete das Programm immer wieder das erste byte array raus auch wenn ich es eigentlich überspielt hatte. Ich hab mir auch die ersten paar bytes aus dem Array ausgeben lassen um zu sehen das es sich jedes mal änderte, aber er sendete trotzdem immer das erste byte array aus.
Ich weis auch nich womit das zusammen hängt aber ich schick mal den code zum senden:
public void run(){
long nochDateiGroesse = Datei.length();
try{
FileInputStream in = new FileInputStream(Datei);
while(0 byte[] buff = new byte[1048576];
if(nochDateiGroesse buff = new byte[(int)nochDateiGroesse];
nochDateiGroesse = 0;
}else{
nochDateiGroesse -= 1048576;
}
in.read(buff);
String[] Parameter = new String[1];
Parameter[0] = anNickname;
client.senden("","dateiSenden",Parameter,Datei,buff);
}
in.close();
client.dSenden.removeElement(this);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
Mit der Methode client.senden sende ich die Daten raus. Sie sendet die Daten über dem ObjectOutputStream als ein Packet raus.
Vorher hatte ich das so geschrieben das buff noch vor der Schleife erstellt wird und immer wieder mit in.read überschrieben und dann rausgesendet wird.
Vieleicht noch eine Idee woran das liegen könnte??

bei Antwort benachrichtigen