• 请不要在回答技术问题时复制粘贴 AI 生成的内容
90928yao
V2EX  ›  程序员

threadlocal 到底什么情况下会内存泄漏?

  •  
  •   90928yao · May 12, 2020 · 3027 views
    This topic created in 2215 days ago, the information mentioned may be changed or developed.

    按照网上图的来说是栈里 threadlocal 的强引用断开后,而这个线程一直存活的情况,value 不会释放 从而导致内存泄漏(这个理解没错吧)

    ThreadLocal tl = new ThreadLocal();
    tl.set(1)
    do something;
    //这边设置 null 断开强引用 应该会产生内存泄漏吧?
    //但是实际开发 应该不会这么无聊 手动设置成 null 吧;
    //所以 实际情况下 什么时候会产生内存泄漏 (排除这种 new ThreadLocal().set(1)的 骚操作) 
    tl = null;
    
    System.gc();
    
    
    9 replies    2020-05-13 09:39:15 +08:00
    szq8014
        1
    szq8014  
       May 12, 2020
    ```tl = null; ```
    这一行没有任何效果,ThreadLocal 这东西是跟线程绑定的,只要你不 remove 或者不把线程关掉,那你 set 的东西就一直在那里陪着线程。
    想要泄漏就可以 set 一个 List 然后 list 一直往里加东西就可以了。
    chendy
        2
    chendy  
       May 12, 2020
    但是 ThreadLocal 本身还有个弱引用兜底,只要没有强应用就会被 gc 带走,所以可以说木有内存泄漏了
    szq8014
        3
    szq8014  
       May 12, 2020
    具体见 java.lang.Thread#threadLocals
    Uchiha0bito
        4
    Uchiha0bito  
       May 12, 2020
    每个线程都有一个 ThreadLocalMap,key 就是这个线程往哪些 ThreadLocal 存放了元素,value 就是对应存放的元素。key 泄漏可以由 jdk 解决,因为 key 引用是弱引用。但是 value 泄漏是没有解决的,需要用户每次使用完就移除,否则就一直在那儿
    Uchiha0bito
        5
    Uchiha0bito  
       May 12, 2020
    所以 tl = null 这个不会导致泄漏,因为没有强引用存在的情况下 value 就被 gc 了。但是,如果是 t1.set(一个 User 对象),那这个 User 对象的强引用就一直被 ThreadLocalMap 存着了,不手动删掉就会泄漏
    jinzhongyuan
        6
    jinzhongyuan  
       May 12, 2020
    @szq8014 这是内存溢出吧?
    hangszhang
        7
    hangszhang  
       May 12, 2020
    ThreadLocalMap 的 get 和 set 方法自己会清除数据,所以已经很难内存泄露了,但是最好还是养成用完 remove 习惯
    szq8014
        8
    szq8014  
       May 13, 2020
    @jinzhongyuan 哈哈,是. 放了不删除就是泄露了,一直放了不管会溢出,2333
    ica10888
        9
    ica10888  
       May 13, 2020
    Entry 是 ThreadLocal 的弱引用,非严格意义来说不会产生内存泄露。用 threadlocal 一般是在多个方法里面线程自己变量的存放,一般不讨论内存泄露的问题...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1066 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 23:18 · PVG 07:18 · LAX 16:18 · JFK 19:18
    ♥ Do have faith in what you're doing.