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

想请问下关于 ThreadLocal 的使用

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

    不然你认为 spring mvc 是怎么同时处理请求的呢。
    e1o
        9
    e1o  
    OP
       2022-09-17 21:33:37 +08:00
    @Hurriance 好吧
    e1o
        10
    e1o  
    OP
       2022-09-17 21:33:49 +08:00
    @zed1018 了解了
    leonme
        11
    leonme  
       2022-09-18 00:09:05 +08:00 via iPhone
    @Hurriance 解释的很明白
    goalidea
        12
    goalidea  
       2022-09-19 10:28:45 +08:00
    线程池
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:33 · PVG 23:33 · LAX 08:33 · JFK 11:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.