ThreadLocal又导致内存泄露啦!!!

文章讲述了在开发项目中遇到的一个问题,即管理员在审批流程时看到错误的用户信息。经过排查,发现问题是由于ThreadLocal使用不当导致的内存泄漏。ThreadLocal是Java中用于线程局部变量的工具,但如果不正确清理其值,在Web应用中可能会造成内存泄漏。解决方案是在每个请求结束时手动调用ThreadLocal的remove方法来清理值。
摘要由CSDN通过智能技术生成

1.背景

大家好,我是阿骏。今天分享一个我们项目中遇到的问题。
详细过程是这样的:开发了一个新需求,需求是用户针对某个业务提交申请,涉及这个业务的管理员进行审批。我们的同学三下五除二开发自测完后发现没问题,但是提交测试后,测试的同学反馈管理员登录后在进行流程审批时有时候能够看到不属于自己审核的流程,刷新后看到的数据又正确,再刷新又不正确了。。。真是个怪事儿啊!

2.排查过程

我们排查了相关逻辑代码–>没问题,再排查sql–>还是没问题啊。折腾半天实在找不出问题了,最后技术leader排查发现使用上下文拿到的用户信息不是当前登陆用户的,而是其他用户的信息。
我们项目是使用的ThreadLocal暂存当前用户的相关信息,便于我们在业务逻辑处理时便捷地拿到用户的信息。所以最后精准定位了是ThreadLocal使用不当导致的内存泄露!

3.什么是ThreadLocal

ThreadLocal是Java中的一个线程级别的变量,它提供了一种在多线程环境下存储和访问线程局部变量的机制。每个线程都有自己独立的ThreadLocal实例,线程可以通过ThreadLocal实例来存储和获取自己线程内部的数据。
在Web应用程序中,每个请求通常会由一个独立的线程来处理。当一个请求结束后,线程会被释放并返回到线程池中,等待下一个请求的到来。在这个过程中,如果使用了ThreadLocal来存储用户信息,那么在请求结束后,ThreadLocal实例会被垃圾回收器(GC)回收。
然而,尽管ThreadLocal实例被回收了,但是在同一个线程内部的其他请求仍然可以访问到之前设置的值。这是因为在每个线程内部,ThreadLocal实例是以ThreadLocalMap的形式存储的,而ThreadLocalMap是与线程绑定的,不会被回收。
当一个请求结束后,线程会被放回线程池中,但是线程的ThreadLocalMap并不会被清空,而是等待下一个请求的到来。当下一个请求到来时,线程会从线程池中取出,并且ThreadLocalMap中仍然保留着上一个请求设置的值,因此可以获取到上一个用户的信息。

4.使用ThreadLocal注意事项

需要注意的是,如果没有正确地清理ThreadLocal的值,可能会导致内存泄漏。因此,在使用ThreadLocal时,需要确保在每个请求结束后,手动清理ThreadLocal的值,以避免潜在的内存泄漏问题。请务必在请求处理的最后,通过调用ThreadLocal的remove方法来清理ThreadLocal的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值