How to resolve OutOfMemoryError with ImageIO plugins as the cause?

后端 未结 2 1786
悲&欢浪女
悲&欢浪女 2021-01-13 14:52

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

2条回答
  •  臣服心动
    2021-01-13 15:34

    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.

提交回复
热议问题