1
duanqw 2022-09-17 17:57:13 +08:00
线程是重复利用的,所以要删除
|
2
urnoob 2022-09-17 17:57:15 +08:00 via Android
关键是
1 平时开发中跑你代码的线程都是只有 jvm 退出它们才终结啊 它们可能是 tomcat jetty 或者线程池的线程。 2 value 不能被 gc 因为 threadlocalmap 还引用了它。 |
3
sprite82 2022-09-17 18:00:22 +08:00
tomcat 初始化 200 个线程,某个线程处理完这个有 threadlocal 的请求,下一次可能处理其他请求了
|
4
e1o OP |
5
e1o OP @urnoob 但是我的 threadlocalmap 没有 gcroot 指向它,根据可达性算法,threadlocalmap 和它下面的 value 应该都被干掉才对呀
|
6
cowcomic 2022-09-17 19:01:46 +08:00 1
|
7
Hurriance 2022-09-17 19:09:16 +08:00 1
你说的没问题,如果线程在处理完请求后它是会被销毁的话,你说的 ThreadLocal 和 Thread 这两个实例对象都是会被回收的,因为他们并没有被虚拟机栈引用到了,即你说的没有跟 GCROOT 关联,但在服务端开发下的绝大多数情况,都是这个线程完成处理了这次请求,有关 ThreadLocal 的栈帧都出栈了,此时 ThreadLocal 实例对象就是能被回收的了,但是线程还是会被重复利用处理其他请求,但是线程中的 ThreadLocalMap 的 key 又是指向 ThreadLoca 实例对象的弱引用,相当于指向为空,导致后期不能被回收了,即内存泄露
|
8
zed1018 2022-09-17 19:12:24 +08:00
> 那就是说虽然我没有定义线程池,但是像用的 springboot 这种框架,它其实隐式地使用了 Tomcat 自带的线程池是吗?
不然你认为 spring mvc 是怎么同时处理请求的呢。 |
12
goalidea 2022-09-19 10:28:45 +08:00
线程池
|