javaThreadLocal内存泄漏如何解决

今天小编给大家分享一下java ThreadLocal内存泄漏如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

成都创新互联公司是一家成都做网站、网站建设、外贸营销网站建设,提供网页设计,网站设计,网站制作,建网站,按需定制制作,网站开发公司,公司2013年成立是互联行业建设者,服务者。以提升客户品牌价值为核心业务,全程参与项目的网站策划设计制作,前端开发,后台程序制作以及后期项目运营并提出专业建议和思路。

1、泄漏实例

ThreadLocalMap的静态内部类Entry:

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

ThreadLocalMap使用静态内部类Entry实现存储,而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内存泄漏如何解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注创新互联行业资讯频道。


当前名称:javaThreadLocal内存泄漏如何解决
URL标题:http://myzitong.com/article/jicejg.html