Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Problem mit garbage collecor in java

MRPSV1 / 5 Antworten / Baumansicht 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
Borlander MRPSV1 „Problem mit garbage collecor in java“
Optionen

Warum erstellst Du das Array denn überhaupt neu? Bzw.: Die Elementaren Datentypen mußt Du doch gar nicht erst instanzieren? U.u. könnte sich hier auch ein Ringpuffer anbieten...

Gruß
Borlander

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
MRPSV1 Nachtrag zu: „Ja aber das musste ich so schreiben, den sonst sendete das Programm immer wieder...“
Optionen

ich hab da noch ein idee.
kann das vieleicht an den threads liegen??denn ich hab drei threads in dem programm laufen einmal das programm selbst eine dauerschleife die auf eingehende daten wartet und einmal die schleife die nur solange läuft bis die datei kommplett gesendet wurde....kann das sein das der garbagecollector in jeden thread unterschiedlich läuft(also ich meine das mein gesamtes programm im prinzip drei garbage collectoren am laufen hat) und das ich ihn in jeden thread extra mit System.gc(); starten muss??

bei Antwort benachrichtigen
MRPSV1 Nachtrag zu: „ich hab da noch ein idee. kann das vieleicht an den threads liegen??denn ich hab...“
Optionen

Also es war nicht das byte array....hab mich da irgentwie vertan. Ich hab noch herausgefunden das es daran liegt das alles was man in den ObjectOutputStream schreibt und raussendet bliebt irgentwie im Arbeitsspeicher vorhanden. Hat jemand ne Idee was das sein könnte??
Danke schonmal.

bei Antwort benachrichtigen
Borlander MRPSV1 „Also es war nicht das byte array....hab mich da irgentwie vertan. Ich hab noch...“
Optionen

Hm, kannst Du evtl. den betreffenden Quelltextabschnitt nochmal posten?

Gruß
Borlander

bei Antwort benachrichtigen