标签:
In my previous post we looked at different categories of ClassLoader leaks, and looked at a particular example of a reference from outside the web application ClassLoader (a JVM shutdown hook pointing to a JAI class).
In this post we will look at another category; unterminated Threads running in your ClassLoader. This is a problem you can easily create yourself, but it may also come from third party libraries.
理解:之前我们介绍了一个类加载器泄露的实例 — JVM的shutdown钩子指向了一个JAI class。本节将介绍另一种导致类加载器泄露的原因:运行在类加载器中的不会终止的线程(被类加载器加载的类中包含不死线程)
When doing the “load all classes from third party JARs” test mentioned in my former post, and analyzing it with the technique outlined in my first post, I also ended up with this finding:
As you can see, it is a thread still running inside my ClassLoader. We can also see, that the thread seems to be part of the Batik library. I was using version 1.5 beta 4, so let’s dig into the sources.
org.apache.batik.util.SoftReferenceCache
(from line 181):
private static Thread cleanup; static { cleanup = new Thread() { public void run() { while(true) { ... } } }; cleanup.setDaemon(true); cleanup.start(); }
org.apache.batik.ext.awt.image.rendered.TileMap
(from line 139):
static Thread cleanup; static { cleanup = new Thread() { public void run() { while(true) { ... } } }; cleanup.setDaemon(true); cleanup.start(); }
So, what do we have here? Not one but two static blocks (executing as the class is loaded) starting threads that execute in a while(true)
loop. Once such a Threads is started, there is no garbage collecting their ClassLoader – neither the ClassLoader having loaded the Thread class (if a custom subclass to java.lang.Thread
), nor the ThreadscontextClassLoader
. In theory, the contextClassLoader
of the thread can be changed (although I believe that rarely makes sense), but to garbage collect the ClassLoader of a custom Threads
subclass, the thread must stop executing.
In newer versions of Batik, the two pieces of code above have been merged together into a new class – org.apache.batik.util.CleanerThread
. That’s good. What’s not good is that there is at the time of this writing still a while(true)
loop… This problem has been reported, and a patch has been proposed.
类加载器泄露学习(三)杀死线程—— Classloader leaks III – “Die Thread, die!”
标签:
原文地址:http://www.cnblogs.com/Guoyutian/p/5062160.html