内存泄露原因找到了,罪魁祸首是Java TheadLocal( 三 )


比较两种情况 , 我们可以发现:由于ThreadLocalMap的生命周期跟Thread一样长 , 如果都没有手动删除对应key , 都会导致内存泄漏 , 但是使用弱引用可以多一层保障:弱引用ThreadLocal被清理后key为null , 对应的value在下一次ThreadLocalMap调用set、get、remove的时候可能会被清除 。
因此 , ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长 , 如果没有手动删除对应key就会导致内存泄漏 , 而不是因为弱引用 。
ThreadLocal最佳实践通过前面几小结我们分析了ThreadLocal的类设计以及内存模型 , 同时也重点分析了发生内存泄露的条件和特定场景 。 最后结合项目中的经验给出建议使用ThreadLocal的场景:

  • 当需要存储线程私有变量的时候 。
  • 当需要实现线程安全的变量时 。
  • 当需要减少线程资源竞争的时候 。
综合上面的分析 , 我们可以理解ThreadLocal内存泄漏的前因后果 , 那么怎么避免内存泄漏呢?
答案就是:每次使用完ThreadLocal , 建议调用它的remove()方法 , 清除数据 。
另外需要强调的是并不是所有使用ThreadLocal的地方 , 都要在最后remove() , 因为他们的生命周期可能是需要和项目的生存周期一样长的 , 所以要进行恰当的选择 , 以免出现业务逻辑错误!
-- END --
日常求赞:你好技术人 , 先赞后看养成习惯 , 保持初心相信技术 。
【内存泄露原因找到了,罪魁祸首是Java TheadLocal】作者:爱笑的架构师链接:来源:掘金著作权归作者所有 。 商业转载请联系作者获得授权 , 非商业转载请注明出处 。