`

ThreadLocal内存泄漏

 
阅读更多

原创转载请注明出处:https://agilestyle.iteye.com/blog/2442834

 

内存泄漏

内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽造成内存空间的浪费。

 

内存溢出

内存溢出则是发⽣了OutOfMemoryException,内存溢出的情况有很多,例如堆内存空间不⾜,栈空间不⾜,还有⽅法区空间不⾜等都会导致内存溢出。

 

内存泄漏与内存溢出的关系:内存泄漏很容易导致内存溢出,但内存溢出不⼀定是内存泄漏导致的。 

 

ThreadLocal是基于ThreadLocalMap实现的,这个Map的Entry继承了WeakReference,⽽Entry对象中的key使⽤了WeakReference封装,也就是说Entry中的key是⼀个弱引⽤类型,⽽弱引⽤类型只能存活在下次GC之前。


 

如果⼀个线程调⽤ThreadLocal的set设置变量,当前ThreadLocalMap则会新增⼀条记录,但由于发⽣了⼀次垃圾回收,此时的key值就会被回收,⽽value值依然存在内存中,由于当前线程⼀直存在,所以value值将⼀直被引⽤。

这些被垃圾回收掉的key就会⼀直存在⼀条引⽤链的关系:Thread -> ThreadLocalMap -> Entry -> value。这条引⽤链会导致Entry不会被回收,value也不会被回收,但Entry中的key却已经被回收的情况发⽣,从⽽造成内存泄漏。

我们只需要在使⽤完该key值之后,将value值通过remove⽅法remove掉,就可以防⽌内存泄漏了。

 

Reference

https://time.geekbang.org/column/article/109201

  • 大小: 327.7 KB
分享到:
评论

相关推荐

    ThreadLocal 内存泄露的实例分析1

    但这里,`ThreadLocal` 的设计使得其内部的引用(即使是最弱的引用)在类加载器试图卸载时依然存在,这就形成了一个内存泄漏点。 解决这个问题的关键在于,我们需要确保在不再需要 `ThreadLocal` 变量时,及时清除...

    ThreadLocal内存泄露分析

    【标题】:“ThreadLocal内存泄露分析” 在Java编程中,ThreadLocal是一个强大的工具类,它为每个线程提供了一个独立的变量副本,使得每个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。然而,...

    ThreadLocal内存泄漏思维导图完整版

    内存泄漏就是JVM垃圾回收器对某个对象占据的内存在较长时间内一直没法回收,没法回收的原因并不是因为垃圾回收器有bug,而是由于对象没法判定为垃圾(但实际上该对象已经是不会被使用了)。这里说的“较长时间”是一...

    实例详解Java中ThreadLocal内存泄露

    解决`ThreadLocal`内存泄漏的一种方法是在web应用关闭或Servlet上下文销毁时,清理`ThreadLocal`的值。在Tomcat中,可以通过实现`ServletContextListener`并在`contextDestroyed`方法中清空`ThreadLocal`来实现: `...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    ThreadLocal 中内存泄漏和数据丢失问题的问题浅析及解决方案 ThreadLocal 是 Java 中的一种线程本地存储机制,它可以解决线程之间的数据传递问题。然而,在使用 ThreadLocal 时,可能会出现内存泄漏和数据丢失问题...

    ThreadLocal原理及内存泄漏原因

    让我们深入理解ThreadLocal的工作原理以及可能导致内存泄漏的原因。 首先,ThreadLocal是如何实现每个线程都有独立变量副本的呢?这主要得益于内部类`ThreadLocalMap`。当一个ThreadLocal对象被创建后,它并没有...

    04、导致JVM内存泄露的ThreadLocal详解-ev

    04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、...

    Java中ThreadLocal的设计与使用

    ### ThreadLocal内存泄漏问题 由于ThreadLocal变量是存储在线程的ThreadLocalMap中,如果线程长时间运行并且不清理ThreadLocal,当ThreadLocal对象被垃圾收集时,其在ThreadLocalMap中的引用将变为"幽灵引用"(弱...

    ThreadLocal的简单理解.doc

    ThreadLocal 内存泄漏是由于 ThreadLocal 对象不能被垃圾回收导致的。这是因为 ThreadLocal 对象被弱引用绑定到 ThreadLocalMap 中,而 ThreadLocalMap 又被强引用绑定到 Thread 中。因此,当 ThreadLocal 对象被...

    2、导致JVM内存泄露的ThreadLocal详解

    1. **线程未正确销毁**:如果线程执行完毕后没有正确销毁或者线程池中线程长期存活,而`ThreadLocal`对象又未能及时清除,那么线程内的`ThreadLocalMap`将会持续占用内存,进而可能导致内存泄漏。 2. **...

    ThreadLocal应用示例及理解

    当线程结束时,与其关联的ThreadLocal变量不会自动清除,可能会导致内存泄漏。因此,推荐在不再使用ThreadLocal时显式调用`remove()`方法。 ```java threadLocal.remove(); ``` ### 示例:线程安全的计数器 假设...

    ThreadLocal

    - 内存泄漏:如果线程长时间存活,或者ThreadLocal对象没有被正确清理,可能导致ThreadLocalMap中的引用无法被垃圾回收,从而造成内存泄漏。 - 不适用于跨线程通信:ThreadLocal只保证同一线程内的数据隔离,不同...

    初见volatile.md,学习代码

    压缩包内的“JUC-ThreadLocal内存泄漏弱引用.png”和“JUC-ThreadLocal内存泄漏强引用.png”可能是对这种问题的视觉解释。 最后,了解并发编程不仅需要掌握`volatile`、`ThreadLocal`等基础概念,还需要理解Java...

    3 JMM内存模型.md,学习代码

    然而,如果不正确地使用 ThreadLocal,可能会导致内存泄漏,因为线程结束后,ThreadLocal 对象不会自动清除,除非显式调用 remove() 方法。 在并发编程中,了解 TimeUnit 类也很重要。TimeUnit 是一个枚举类,提供...

    java中ThreadLocal详解

    需要注意的是,尽管使用了弱引用来避免内存泄漏,但仍需谨慎管理`ThreadLocal`实例的生命周期,确保及时释放不再使用的资源。此外,`ThreadLocalMap`通过开放地址法来解决哈希冲突,进一步提高了性能并减少了内存...

    Java系统中内存泄漏测试方法的研究

    4. ThreadLocal:如果线程局部变量未被正确清理,可能会导致内存泄漏。 5. 注册监听器未取消:注册的监听器如果没有在适当的时候解除注册,会持续持有对对象的引用。 四、内存泄漏的检测方法 1. **手动代码审查**...

    多线程基础部分.md,学习代码

    然而,如果不正确地使用ThreadLocal,可能会导致内存泄漏,这正是“JUC-ThreadLocal内存泄漏弱引用.png”和“JUC-ThreadLocal内存泄漏强引用.png”所要揭示的问题。 “TimeUnit.md”可能涵盖了Java中的TimeUnit枚举...

    关于java内存泄漏

    4. **ThreadLocal变量**:ThreadLocal中保存了对对象的强引用,如果线程长时间存活,而这些对象又不再被使用,则会导致内存泄漏。 #### 四、Java内存泄漏的检测与避免 ##### 检测方法: 1. **工具辅助**:使用...

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄露, 一次的内存泄露似乎不会有大的影响,但是内存泄露堆积的后果就是内存...

Global site tag (gtag.js) - Google Analytics