Input/Output ObjectInputStream.HandleTable OutOfMemory

kaetzacoatl

Bekanntes Mitglied
Hallo,
ich bekomme immer wieder eine
OutOfMemoryException.
Ich konnte den Fehler bis auf
ObjectInputStream.HandleTable
zurückverfolgen.
Hier werden alle gelsenen Objekte
scheinbar gespeichert.

Nun meine Frage:
Gibt es eine Möglichkeit,
das speichern der Objekte zu
verhindern oder sie zu löschen?

Mit Reflektion hab ich es schon
probiert, brigt allerdings nur
noch mehr Fehler.
 

Bernd Hohmann

Top Contributor
Hallo,
ich bekomme immer wieder eine
OutOfMemoryException.
Ich konnte den Fehler bis auf
ObjectInputStream.HandleTable
zurückverfolgen.

Bug ID: 6525563 Memory leak in ObjectOutputStream, priority: low ;(

Diskussion dazu ua. unter Why doesn't java.io_ObjectOutputStream use weak references? | Java.net

Bisserl Internals zum HandleTable: http://www.docjar.com/docs/api/java/io/ObjectInputStream$HandleTable.html

Wenn Du kannst, mach Deinen Stream öfters mal zu oder [STRIKE]klau[/STRIKE] leihe Dir den Sourcecode zu ObjectInputStream aus Java 1.1.8 - da bestand das Problem nicht (dafür hat Dir der Stream auch nicht besonders viele Garantien gegeben).

Alternativ: Externalize verwenden und alles zu Fuß machen.

Bernd
 

Bernd Hohmann

Top Contributor
Das ist schlecht für die Sockets.

Ich weiss jetzt nicht was passiert, wenn Du den ObjectOutputStream regelmässig wegwirfst und neu erzeugst ohne dass da ein Close gemacht wird.

Alternativ halt XStream - About XStream nehmen oder zu Fuss serialisieren ohne dass Referenzen auf die Objekte gehalten werden.

1.1.8er Code ... Ich dachte, dass IBM da auf seinen alten OS/2 Servern noch was herumfliegen hat, aber das wurde mittlerweile aufgeräumt - schade.

Bernd
 

Bernd Hohmann

Top Contributor
Das hat mir jetzt doch keine Ruhe gelassen und hab was gefunden:

Code:
ObjectOutputStream#reset():

Reset will disregard the state of any objects already written 
 to the stream. The state is reset to be the same as a new 
 ObjectOutputStream. The current point in the stream is 
 marked as reset so the corresponding ObjectInputStream 
 will be reset at the same point. Objects previously written 
 to the stream will not be refered to as already being in the 
 stream. They will be written to the stream again.
Throws:
	IOException - if reset() is invoked while serializing an 
	 object.

Auf kickjava gibt es unter Java > Java SE, EE, ME > java > io > ObjectOutputStream _ Java API By Example, From Geeks To Geeks. dazu den Kommentar:
Code:
By Anonymous on 2004/10/01 14:46:22  Rate
Object streams maintain an internal cache of the objects they have already read/written. This means that any object that has been transferred once does not have to be transferred a second time. However, it does not keep track of changes during the lifetime of an object. This means that, if you send an object, make a change in it, and send it again, the other end gets the old object. To ensure correct behaviour, you should use immutable objects or take care that you do not accidentally change the objects.  
 Unfortunately, the object stream does not flush any of its cache, which means that it just keeps growing and growing when you send more objects over it, even if they are never referred to again on the sender's side. This is in fact a kind of memory leak. This means that you have to call the reset (  )  method periodically to ensure that you do not run out of memory. Unfortunately, reset (  )  is too slow to call every time you send an object.

Ich hab mal im Source nachgeschaut: reset() löscht auch Deine HandleTable.

HTH
Bernd
 

kaetzacoatl

Bekanntes Mitglied
Bei reset bekomme ich immer diesen Fehler:
Code:
java.io.IOException: mark/reset not supported
Was mach ich falsch?

edit:code vergessen:
Java:
while ((o = in.readObject()) != null) {
			display.setPanel((int[][]) o);
			out.writeObject(display.getUserActions());
			out.reset();
			in.reset();
		}
 
Zuletzt bearbeitet:

Bernd Hohmann

Top Contributor
Der ObjectInputStream unterstützt kein .reset() (da könnte ja jeder kommen :pueh:)

Das macht aber nichts, denn wenn auf den ObjectOutputStream ein .reset() gemacht wird schickt er ein Signal über die Leitung damit der ObjectInputStream auf der Gegenseite entsprechend handeln kann.

Ich kann mich mittlerweile ganz dunkel daran entsinnen, dass wir mal auf ein ähnliches Problem gestossen sind. .reset() nach jedem Block ist nicht so gut, entweder nach einer grösseren Operation oder wenn Du zb. 100x durch die Schleife gelaufen bist - muss man bisserl ausprobieren und balancen.

Bernd
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Auslesefehler beim ObjectInputStream(Array) Allgemeine Java-Themen 6
P ObjectOutputStream oder ObjectInputStream fehlerhaft? Allgemeine Java-Themen 7
P ObjectInputStream kann nicht vernünftig lesen... Allgemeine Java-Themen 9
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
T Klasse in externer JAR mit ObjectInputStream Allgemeine Java-Themen 14
B ObjectInputStream - Wann ist Ende erreicht? Allgemeine Java-Themen 10
J ObjectInputStream und OutOfMemory Allgemeine Java-Themen 10
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
J BufferedReader OutOfMemory umgehen? Allgemeine Java-Themen 10
N OutOfMemory Allgemeine Java-Themen 5
G OutOfMemory Error bei Zahlenkonvertierungsprogramm Allgemeine Java-Themen 5
B Java OutOfMemory Error verhindern, Resourcenbedarf präventiv abschätzen? Allgemeine Java-Themen 19
M OutOfMemory Exception? Allgemeine Java-Themen 12
N OutOfMemory nur wenn -Xmx gesetzt ist?! Allgemeine Java-Themen 6
E java.lang.outofmemory über windows-cmd ändern Allgemeine Java-Themen 6
R Speicherprobleme (OutOfMemory Error) Allgemeine Java-Themen 26
V JVM OutofMemory Linux geht, windows nicht Allgemeine Java-Themen 3
H java heap space (outofmemory error) Allgemeine Java-Themen 3
K OutOfMemory beim Entzippen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben