• 技术文章 >java >java教程

    java ThreadLocal内存泄漏的解决

    小妮浅浅小妮浅浅2021-02-25 11:31:24原创4215

    在线程中有一种方法,频繁被大家所调用,那就是 ThreadLocal。不过在内存的处理上,ThreadLocal也会遇到比较棘手的问题,总是会产生一些内存的泄漏。本篇将会以一个泄漏实例为大家展开分析,也帮助大家了解泄漏中的一些情况,并提出ThreadLocal对应的解决办法。

    1、泄漏实例

    ThreadLocalMap的静态内部类Entry:

        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;
     
            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

    ThreadLocalMap使用静态内部类Entry实现<k,v>存储,而Entry继承WeakReference类,所以ThreadLocalMap中的key其实是ThreadLocal的一个弱引用。

    正因为ThreadLocalMap以ThreadLocal的弱引用作为key,在这个ThreadLocal没有外部强引用的时候,会被GC。这时候,ThreadLocalMap会出现一个key为null的Entry,理所当然的,这个Entry的value将永远没办法被访问到。

    在这种情况下,如果当前工作线程一直没有结束,那这个key为null的value因为被Entry强引用,而Entry被当前线程的ThreadLocalMap强引用,导致这个value永远无法被GC,造成内存泄漏。

    2、解决办法

    ThreadLocalMap的cleanSomeSlots(),expungeStaleEntry()方法都能清除key为null的value。 在ThreadLocal的set(),get(),remove()方法中,都会调用cleanSomeSlots()或expungeStaleEntry()来清除ThreadLocalMap中所有key为null的value。

    以上就是java ThreadLocal内存泄漏的解决,当然这只能对内存泄漏起到一定的作用,毕竟只是一种清楚,不能保证一定不会出现更多Java学习指路:java教程

    专题推荐:java threadlocal
    品易云
    上一篇:java之JVM指令系统是什么? 下一篇:java中如何封装JDBC工具类

    相关文章推荐

    • java二分法如何找寻数组的位置• java中wait调用中断怎么办?• java之JVM指令系统是什么?• java虚拟机中的栈结构如何理解

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网