ObjectInputStream wird zu groß (OutOfMemoryError)

Lastlord

Mitglied
hallo,

Ich habe ObjectInputStream und rufe ständig die readObject()-Methode dieser Klasse auf.
Nach einiger Zeit kommt es immer zu einem OutOfMemoryError.
Ich habe mir daraufhin von sourceforge.net ein Tool geholt mit dem ich größe von Objekten ausgeben kann.
Die Ausgbe zu Streamgröße sah so aus:
(ca. jede Sekunde gemessen)

Size: 2714576 (2,7MB)
Size: 5365832
Size: 7205832
Size: 10667848
Size: 12507848
Size: 14347848
Size: 16187848
Size: 21271880
Size: 23111880 (23,1 MB):eek:

Das geht so nicht.
Ich nehme an, dass die von mir ausgelesenen Daten nich aus dem Steam gelöscht wurden.

Wie kann ich dieses Stream-Objekt kleiner kriegen

Hat jemand eine Idee?
 
Moin,

vermute ich richtig, dass der Stream innerhalb einer Schleife o. ä. benutzt wird (der entsprechende Code fehlt hier leider) ? ?
Wieviel Daten sollen denn gelesen werden? ?

Du kannst ihn dann am Ende der readObject()-Methode so schließen:
Java:
ObjectInputStream in = null;
in = new ObjectInputStream( xXx );
...
in.close
// oder
in = null;

Gruß
Klaus
 
Wenn das Objekt so riesig ist was du ausliest, liegts aber nicht am Stream dass du nen OutOfMemoryError bekommst, sondern eher an dem Objekt welches du ausliest und was dann bei dir im Speicher liegt.

In dem Fall musst du den Speicher von Java mit dem -Xmx / -Xms Optionen entsprechend anpassen.
 
Vielen Dank für deine Antwort.
ja, ich benutze die readMethode in einer Schleife.

Wie viele Daten übertragen werden, hängt von der Zeit ab, wie lange die Verbindung besteht.
In regelmäßigem Abstand werden Objekte gestreamt.
Beim profilen merkte ich das auf die Dauer der Speicher immer voller wird.
Also habe ich sämtliche Verzögerungen durch Thread.sleep usw. entfernt um herauszufinden, wo das "Memoryleak" ist.

Hier der Code:
Java:
while (!isInterrupted()) {
				if (sock.isClosed() || sock.isOutputShutdown()
						|| sock.isInputShutdown())
					break;
				Message tmp = readMessage();

				handleMessage(tmp);
			}
readMessage() macht nur dies:
Java:
return (Message) in.readObject();

handleMessage arbeitet nicht mit dem Stream.
 
Zuletzt bearbeitet:
Danke für deine Antwort zeja
Die Objekte sind durchgehend ca. 250 Byte groß und werden nicht abgespeichert, sondern nur ausgegeben. An den Objekten liegt es also vermutlich nicht.

Das Problem scheint viel mehr, dass der Stream die Objekte zwar zurück gibt aber nicht aus seinen internen Listen,Vectoren oder was auch immer löscht.
Dadurch wächst der Stream ständig, bis er zu groß wird.

Hat jemand ne Idee wie man den Stream dazu veranlassen kann die Objekte nicht ewig zu bunkern.
 
Hier der Code:
Java:
while (!isInterrupted()) {
				if (sock.isClosed() || sock.isOutputShutdown()
						|| sock.isInputShutdown())
					break;
				Message tmp = readMessage();

				handleMessage(tmp);
			}
readMessage() macht nur dies:
Java:
return (Message) in.readObject();

handleMessage arbeitet nicht mit dem Stream.

Ich kann nur nochmals auf den Beitrag von vfl_freak hinweisen.
An welche stelle schließt du den Stream denn?
 
ich schließe den Stream in Codezeile 9, also direkt nach der Whileschleife.
Der OutOfMemoryError tritt jedoch vorher auf, nach ein etwa 90000 Aufrufen von readObject auf.

Und bevor die Übertragung beendet ist soll ich doch den Stream nicht schließen, oder?
 
Ich habe beim debuggen was festgestellt.
hier

Der ObjektInputstream bunkert also wirklich massenhaft alles, was er kriegt und löscht es nicht, wenn man es abruft.
Auf dem Bild diese unzähligen Handels, die wenn man draufklickt tatsächlich die übertragenen Objekte enthalten. Die muss man doch irgendwie vermeiden können.

Hattet ihr da denn nie Probleme mit der Klasse, oder bin ich zu .... .
 

Anhänge

  • Debug.png
    Debug.png
    11,9 KB · Aufrufe: 56
wow, so eine einfache Lösung. Auf die Idde, was am OutputStream zu machen, wär ich nie gekommen.:rolleyes: Vielen, vielen Dank!!:p:p
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück