您好!欢迎来到北极熊

北极熊

热门搜索: 任正非传    神雕侠侣    红楼梦   

java ThreadLocal内存泄漏如何解决

分类:人工智能与机器学习 时间:2022-11-09 20:30 浏览:273
概述
1、泄漏实例ThreadLocalMap的静态内部类Entry: JavaScript    static class Entry extends WeakReference<ThreadLocal<?>> {         &nb
内容

1、泄漏实例

ThreadLocalMap的静态内部类Entry:

 JavaScript

    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。


评论
资讯正文页右侧广告
联系我们
电话:18936411277
邮箱:1044412291@qq.com
时间:09:00 - 19:00
公众号:北格软件
底部广告