At work we have some tomcat servers running several webapps, about half of which have to do some image processing.
Before doing their image processing, these webapp
Looks like a ugly memory leak to me, i can't guess where it is without looking the whole code, but i know what you should check very carefully.
Possible causes:
_Global Variable List, adding elements, never remove them.
_Infinite/big loops, loading lots of elements to Lists, never remove them.
Also it would help if you use a Java profiler, such as VisualVM
If you provide more information in order to have a better idea of how it works I i may be able to improve my answer, there's nothing i can do without more information =)
Hope it helps!
Late answer to an old question, but anyway:
Because the ImageIO
plugin registry (the IIORegistry
) is "VM global", it doesn't by default work well with servlet contexts. This is especially evident if you load plugins from the WEB-INF/lib
or classes
folder, as the OP seems to do.
Servlet contexts dynamically loads and unloads classes (using a new class loader per context). If you restart your application, old classes will by default remain in memory forever (because the next time scanForPlugins
is called, it's another ClassLoader
that scans/loads classes, and thus they will be new instances in the registry. In the test code loop, the same ClassLoader
is used all the time, thus instances are replaced, and the real problem never manifests).
To work around this resource leak, I recommend using a ContextListener
to make sure these "context local" plugins are explicitly removed. Here's an example IIOProviderContextListener I've used in a couple of projects, that implements dynamic loading and unloading of ImageIO
plugins.