Before anyone suggests I browse the archives,
don't bother--I have, but haven't found a solution or even direction to
look.
I'm having serious problems with
java.lang.OutOfMemory errors that have "no stack
trace" in my little MMORPG aspp. They're random, sometimes coming after
the app's been running for an hour, sometimes after a few minutes.
I've been very careful about creating objects
only when needed.
I've tired bigger nitial and max heap
sizes.
I've compiled with full debug info (still no strack
trace info shows up).
I've ran OptimizeIt!'s profiler, and see objects
building up and being freed, but very slowly--at times there are hundreds of my
"Scenery" class objects that have been detached(), null'd and are ready for GC,
but they don't get cleaned out. The scenery class itself uses little
memory, but the models they load (using cloneTree from a source model object),
will of course use up some memory.
I tried using SharedGroups and Links, but they were
even worse at being freed, and would build up into the hundreds, and then out of
memory errors would happen.
I've reduced J3DThreadPriority to 8 (any less than
that and the app becomes poorly responsive), to make sure the rendering threads
weren't keeping the GC low-priority thread from running.
In memory, at any given time, I might have 10
terrain textures (256x256 JPG's), 81 terrain "blocks" (a 4x4 poly textured
mesh), and anywhere from 30-100 "Scenery" objects, which are loaded from the
StarFire 3DS loader, and have their own textures (which have been optimized for
size and dimensions). The terrain blocks and Scenery objects are
loaded dyanimcally as the moves around the world. Model and terrain height
data is received form the server (eventually to be stored locally), and
processed in the FrameManagement behavior below.
The FrameManagement behavior handles animation,
player movement, model loading, dropping out of range terrain and scenery
objects, requesting new ones from the server, etc. The processStimulus
typically runs in under 20ms.
There's also another thread handling socket
communications to and from the game server. For now these communications
are TCP based, but I'll probably move a few non-essential functions to UDP
(player movement, time of day synchonization, chat messages, emotes, etc).
These messages usually continue to be received and to be sent after the out of
memory error; when that happens, only the rendering seems to stop.
I've tried incremental garbage collection. Of
course, forcing a System.gc() isn't an option, it causes serious stutters
in the display.
I realize this isn't much to go on, but I'm sure
somebody (David Y.?) has run into these problems before--effective GC when the
system is going full bore rendering highest possible
framerates. It seems the bigger the app gets, the worse the
out of memory errors occur, to the point that I'm afraid of adding any more
features to it...
Any input/direction would be helpful..
Scott
Virtopia 2 3D Project
|
- Re: [JAVA3D] Memory problems in J3D App; No Stack Trace... Scott Mobile
- Re: [JAVA3D] Memory problems in J3D App; No Stack ... Yazel, David J.
- Re: [JAVA3D] Memory problems in J3D App; No St... Scott Mobile
- Re: [JAVA3D] Memory problems in J3D App; N... Pasi Paasiala
- Re: [JAVA3D] Memory problems in J3D Ap... Daniel Selman
- Re: [JAVA3D] Memory problems in J... Scott Mobile
- Re: [JAVA3D] Memory problems in J3D App; N... Octavian Nasarimba
- Re: [JAVA3D] Memory problems in J3D App; No Stack ... Chien Yang