ThreadLocal中的内存泄露问题:
时间: 2023-10-17 21:29:48 浏览: 91
在ThreadLocal中,内存泄露问题通常是由于没有正确地清理ThreadLocal对象造成的。当一个线程调用ThreadLocal的set方法设置变量时,当前线程的ThreadLocalMap里面就会存放一个Entry对象,这个记录的key为ThreadLocal的引用,value则为设置的值。如果当前线程一直存在而没有调用ThreadLocal的remove方法,并且这时候其它地方还是有对ThreadLocal的引用,则当前线程的ThreadLocalMap变量里面会存在ThreadLocal变量的引用和value对象的引用是不会被释放的,这就会造成内存泄露的。即使ThreadLocal变量没有了其他强依赖,而当前线程还存在,由于线程的ThreadLocalMap里面的key是弱依赖,那么在垃圾回收时,当前线程的ThreadLocalMap里面的ThreadLocal变量的弱引用会被回收,但是对应的value还是会造成内存泄露。因此,在使用ThreadLocal时,需要确保及时调用remove方法来清理ThreadLocal引用,以避免内存泄露的问题。另外,使用线程池的情况下,使用完ThreadLocal一定要使用remove方法即时清理,因为ThreadLocal是属于某个线程的,而在使用线程池的情况下,这些线程都是可重复利用、存活时间长的线程,如果在使用过程中不及时remove,就会造成内存泄露的问题,并且可能引发一些功能逻辑问题,比如多个请求可能获取到了线程池中同一个线程的ThreadLocal值。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [ThreadLocal的内存泄露问题](https://blog.csdn.net/sunao1106/article/details/127133911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [记一次ThreadLocal引发的内存泄露](https://blog.csdn.net/kshzhaohui/article/details/111244981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文