Java threadlocal变量是否需要是静态的才能造成内存泄漏

Java threadlocal变量是否需要是静态的才能造成内存泄漏,java,garbage-collection,classloader,thread-local,Java,Garbage Collection,Classloader,Thread Local,在这个链接上 它们描述了使用类加载器时的内存泄漏。现在发表以下评论: 只有在没有其他引用的情况下,垃圾收集器才会删除类加载器。所有类都持有对其类加载器的引用,所有对象都持有对其类的引用。因此,如果一个应用程序被卸载,但它的一个对象仍被保留(例如,通过缓存或线程局部变量),则垃圾收集器不能删除底层类加载器 我有些理解。但在他们说: (例如,通过缓存或线程局部变量) 我说缓存是指静态引用,threadlocal是指非静态threadlocal变量,对吗。我这样说是因为所有关于threadlocal内

在这个链接上

它们描述了使用类加载器时的内存泄漏。现在发表以下评论:

只有在没有其他引用的情况下,垃圾收集器才会删除类加载器。所有类都持有对其类加载器的引用,所有对象都持有对其类的引用。因此,如果一个应用程序被卸载,但它的一个对象仍被保留(例如,通过缓存或线程局部变量),则垃圾收集器不能删除底层类加载器

我有些理解。但在他们说:

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

我说缓存是指静态引用,threadlocal是指非静态threadlocal变量,对吗。我这样说是因为所有关于threadlocal内存泄漏的代码解释都使threadlocal变量成为静态变量。比如说这个问题,


关于缓存的注释,我的另一个问题是:当应用程序关闭时,静态变量将被GC删除,那么为什么这会出现问题呢?

每个线程(实际上)都有一个WeakHashMap,其中数据是某个对象,对象指类,类指类加载器,类加载器指它加载的所有类(例如,螺纹局部固定器),ThreadLocalHolder类有一个保存ThreadLocal的static,因此WeakHashMap值引用键,这会阻止在整个Thread对象消失之前收集键+值。有关更详细的解释和示例,请参阅my。

您介意将其标记为Java还是您的问题也适用于其他GC,例如是.Net的吗?