This post is intended to conclude the series about classloader leaks, and I want to use it to declare war! (Not as in Web application archive though…)
I have decided to pursue the fight against classloader leaks, and I invite you to join me. For this purpose I have created a project on GitHub called
classloader-leak-prevention. The project consists of two parts.
Classloader leak protection listener
First and foremost there is a component for you to add to your web application, that intends to remove and work around as many of the known issues as possible. This will allow us not to depend on bugs being fixed in third party libraries. Yes, this is somewhat like what Tomcat has built in, but my component covers cases that Tomcat currently does not. Another major advantage is that my component is Application Server independent.
It should be as easy as adding a JAR or .java file, configuring a
web.xml, and you should be protected against
java.lang.OutOfMemoryError: PermGen space caused by your app leaking classloaders (you could still run out of PermGen however, or other apps on the same server may leak). In due time, I hope that parts of it will be configurable to your needs (check back here for updates). If it is not configurable enough, feel free to subclass or create your own GitHub fork.
To configure the main prevention mechanism, just add the component to your project and insert this into your
<listener> <listener-class> se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor </listener-class> </listener>
It makes sense to keep this listener “outermost” (initializing first, destroying last), so you should normally declare it before any other listeners in
The library is available in Maven Central with the following details:
<dependency> <groupId>se.jiderhamn</groupId> <artifactId>classloader-leak-prevention</artifactId> <version>1.15.2</version> </dependency>
Non-Maven users can download the JAR with the current version (1.15.2) of the project » here «.
The context listener has a number of settings, see the readme on GitHub.
Classloader leak detection / test framework
Another part of the project, is a framework that allows the creation of JUnit tests, that confirms classloader leaks in third party APIs. It is also possible to test leak prevention mechanisms to confirm that the leak really is avoided.
Read more about this on GitHub.
This project is licensed under the Apache 2 license, which allows you to include modified versions of the code in your distributed software, without having to release your source code.
Links to all parts in the series
Part I – How to find classloader leaks with Eclipse Memory Analyser (MAT)
Part II – Find and work around unwanted references
Part IV – ThreadLocal dangers and why ThreadGlobal may have been a more appropriate name
Part V – Common mistakes and Known offenders
Part VI – “This means war!” (leak prevention library)