【问题标题】:Does a threadlocal variable need to be static to pose a memory leak线程局部变量是否需要是静态的才能造成内存泄漏
【发布时间】:2013-09-02 07:31:10
【问题描述】:

在这个链接here

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

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

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

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

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

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

【问题讨论】:

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

标签: java garbage-collection classloader thread-local


【解决方案1】:

每个线程(实际上)都有一个 WeakHashMap,其中 Data 是某个对象,对象指的是 Class,Class 指的是 ClassLoader,ClassLoader 指的是它已经加载的所有类(例如,ThreadLocalHolder),ThreadLocalHolder 类有一个包含 ThreadLocal 的静态变量,因此 WeakHashMap 值引用键,这会阻止键+值被收集,直到整个 Thread 对象消失。有关更详细的说明和示例,请参阅我的 this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2014-01-09
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多