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

时间:2013-08-29 18:12:25

标签: java garbage-collection classloader thread-local

点击此链接here

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

  

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

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

的部分
  

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

我是否正确地说,通过缓存它们意味着静态引用,而通过threadlocal,它们意味着非静态线程局部变量。我这样说是因为threadlocal内存泄漏的所有代码解释都使threadlocal变量成为静态变量。例如,这个问题in SO

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

1 个答案:

答案 0 :(得分:1)

每个Thread都有(有效)一个WeakHashMap,其中Data是一些对象,对象是指Class,Class是ClassLoader,ClassLoader是指它加载的所有类(例如,ThreadLocalHolder),ThreadLocalHolder类有保存ThreadLocal的静态,因此WeakHashMap值引用键,这会阻止在整个Thread对象消失之前收集键+值。有关更详细的说明和示例,请参阅我的this answer