V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
e1o
V2EX  ›  Java

想请问下关于 ThreadLocal 的使用

  •  
  •   e1o · 144 天前 · 1356 次点击
    这是一个创建于 144 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们一般在使用 ThreadLocal 的使用,都会将它定义为静态变量或者成员变量,这样每次 set 和 get 完之后就直接不用管就行,但是为啥网上的文章都说要调一下 remove 要不然内存溢出,我个人的理解是,随着线程的终结,线程内部的 ThreadLocalMap 中,key 是弱引用 GC 会直接消失,value 的话在 GC 的时候因为没有 GCROOT 关联,所以也会被清除掉才对把,是我理解的有偏差吗?
    duanqw
        1
    duanqw  
       144 天前
    线程是重复利用的,所以要删除
    urnoob
        2
    urnoob  
       144 天前 via Android
    关键是
    1 平时开发中跑你代码的线程都是只有 jvm 退出它们才终结啊 它们可能是 tomcat jetty 或者线程池的线程。
    2 value 不能被 gc 因为 threadlocalmap 还引用了它。
    sprite82
        3
    sprite82  
       144 天前
    tomcat 初始化 200 个线程,某个线程处理完这个有 threadlocal 的请求,下一次可能处理其他请求了
    e1o
        4
    e1o  
    OP
       144 天前
    @duanqw
    @sprite82 那就是说虽然我没有定义线程池,但是像用的 springboot 这种框架,它其实隐式地使用了 Tomcat 自带的线程池是吗?
    e1o
        5
    e1o  
    OP
       144 天前
    @urnoob 但是我的 threadlocalmap 没有 gcroot 指向它,根据可达性算法,threadlocalmap 和它下面的 value 应该都被干掉才对呀
    Hurriance
        7
    Hurriance  
       144 天前   ❤️ 1
    你说的没问题,如果线程在处理完请求后它是会被销毁的话,你说的 ThreadLocal 和 Thread 这两个实例对象都是会被回收的,因为他们并没有被虚拟机栈引用到了,即你说的没有跟 GCROOT 关联,但在服务端开发下的绝大多数情况,都是这个线程完成处理了这次请求,有关 ThreadLocal 的栈帧都出栈了,此时 ThreadLocal 实例对象就是能被回收的了,但是线程还是会被重复利用处理其他请求,但是线程中的 ThreadLocalMap 的 key 又是指向 ThreadLoca 实例对象的弱引用,相当于指向为空,导致后期不能被回收了,即内存泄露
    zed1018
        8
    zed1018  
       144 天前
    > 那就是说虽然我没有定义线程池,但是像用的 springboot 这种框架,它其实隐式地使用了 Tomcat 自带的线程池是吗?

    不然你认为 spring mvc 是怎么同时处理请求的呢。
    e1o
        9
    e1o  
    OP
       144 天前
    @Hurriance 好吧
    e1o
        10
    e1o  
    OP
       144 天前
    @zed1018 了解了
    leonme
        11
    leonme  
       144 天前 via iPhone
    @Hurriance 解释的很明白
    goalidea
        12
    goalidea  
       142 天前
    线程池
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1343 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:23 · PVG 07:23 · LAX 15:23 · JFK 18:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.