2

在这个链接这里

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

只有当没有其他东西引用它时,垃圾收集器才会删除类加载器。所有类都持有对其类加载器的引用,所有对象都持有对其类的引用。结果,如果应用程序被卸载但其中一个对象仍然被持有(例如,由缓存或线程局部变量持有),则垃圾收集器无法删除底层类加载器!

我有点明白了。但在他们说的部分:

(例如,通过缓存或线程局部变量)

我是否正确地说缓存是指静态引用,而线程本地是指非静态线程本地变量。我这样说是因为线程局部内存泄漏的所有代码解释都将线程局部变量设为静态。例如,SO中的这个问题

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

4

1 回答 1

1

每个线程(实际上)都有一个 WeakHashMap,其中 Data 是某个对象,对象指的是 Class,Class 指的是 ClassLoader,ClassLoader 指的是它已加载的所有类(例如,ThreadLocalHolder),ThreadLocalHolder 类有一个静态持有 ThreadLocal,因此 WeakHashMap 的值是指 key,这会阻止 key+value 被收集,直到整个 Thread 对象消失。有关更详细的解释和示例,请参阅我的这个答案。

于 2013-09-07T05:54:28.397 回答