2013-08-29 13 views
2

在这个环节here难道一个ThreadLocal变量必须是静态的提出一个内存泄露

他们使用的类加载器时描述内存泄漏。现在这个评论:

一个类加载器将被垃圾回收器删除只有当没有别的引用它。所有类都持有对其类加载器的引用,并且所有对象都持有对其类的引用。因此,如果一个应用程序被卸载,但其中一个对象仍然被保留(例如,通过缓存或线程局部变量),则底层类加载器不能被垃圾收集器删除!

我对此有所了解。但在部分时,他们说:

(例如,通过高速缓存或一个ThreadLocal变量)

我是正确的说,通过高速缓存他们的意思是静态参考,并ThreadLocal的,它们表示一个非静态的threadlocal变量。我这样说是因为线程本地内存泄漏的所有代码解释都使threadlocal变量为静态。例如,这个问题in SO

我对缓存的评论的其他问题是:当应用程序停机时,静态变量将被GC-ed,那么为什么这会出现问题?

+0

您是否介意将此标记为Java,或者您的问题是否也适用于其他GC,例如.Net? – rene

回答

1

每个线程都有(有效)WeakHashMap,其中Data是一些对象,对象指的是Class,Class指的是ClassLoader,ClassLoader指向它已加载的所有类(例如ThreadLocalHolder),ThreadLocalHolder类有一个保存ThreadLocal的静态,所以WeakHashMap值指的是密钥,它可以防止在整个Thread对象消失之前收集键+值。有关更详细的解释和示例,请参阅我的this answer