OutOfMemoryError: Java heap space trotz world.removeObject()

Started by NeonNeon, August 14, 2015, 09:20:49 AM

Previous topic - Next topic

NeonNeon

ich habe bei meiner Desktop-Applikation das Problem, dass der Speicher komplett voll läuft.

Ich habe ein Objekt vom Typ World. Dem füge ich 2 unterschiedliche Object3D Objekte hinzu.
Die Object3D Objekte erstelle ich in dem ich anhand einer Punktewolke und der Kanten die methode addTriangle aufrufe.
Einer der beiden Object3D objekte verwende ich als parent für den anderen.
Soweit kein Problem.

Das Problem entsteht, wenn ich eine Veränderung der OBjekte beginne.
Mein Vorgehen ist wie folgt:
1) Ich passe die Punktwolke an
2) entferne das ursprungsobjekte aus der Welt (world.removeObject(object3D))
3) ich entferne das ursprungsobjekt als kind des parent
4) initialisiere das object3d neu (object3D=new Object3D)
5) ich füge erneut Triangles dem Object3D hinzu (object3D.addTriangle(...)).
6) schlussendlich builde ich das Object3D neu (object3D.build())
7) ich weise dem Object3D wieder den parent zu
8 ) das object3D wird der World hinzugefügt (world.addObject(object3D))
9) die Scene wird refresh

wenn ich so vorgehe, wird mein Speicher vollständig ausgelastet, prinzipiell wird dies in einer Schleife mehrmals durchlaufen. Irgendwann bekomme ich die Exception OutOfMemoryError: Java heap space.
Was muss/kann ich tun, damit das alte object3D, nachdem ich es überschrieben habe, aus dem Speicher gelöscht wird?

Vielen Dank im vorraus und
Schönen Gruß

p.s.: auch diese Methoden haben nicht zum Erfolg geführt
- object3D.decompile(buffer);
- object3D.clearObject();
- object3D.unbuild();
- object3D = null;

EgonOlsen

Hmm..das sollte eigentlich kein Problem sein. Es kann sein, dass jPCT die Referenz auf eine Object3D-Instanz noch für einen weiteren Frame hält, aber dann sollte die auch verschwinden. Wieviel  Speicher hast du der JVM denn erlaubt zu nutzen? Du könntest mal mit VisualVM tracken, wo der Speicher hingeht (ist im JDK dabei, ansonsten auch hier: https://visualvm.java.net/)...
Die ganzen Methoden am Ende deines Posts solltest du nicht benötigen. Rufst du compile() auf den Objekten auf oder nicht?

NeonNeon

Danke für den Tip den Heap mit dem VisualVM zu tracken.  :)

Du hattest natürlich recht.
Ich konnte jetzt herausfinden, dass das Problem nicht mit dem JPCT-Gebrauch zusammenhängt. Es sind Funktionen verantwortlich, die in der Anwendung neben dem Erstellen der Object3D Objekte ausgeführt werden.
Ich weiß zwar noch nicht wieso das so kommt, und wie ich das beheben kann. Aber das ist dann ja kein Problem mehr für diesen Thread.  ;)

Die Compile-Methode benutze ich im übrigen nicht.

Schönen Gruß