ThreadLocal内存泄露分析

痛定思痛。 2024-03-08 04:59 175阅读 0赞

目录

  • 1 ThreadLocal快速入门使用
  • 2 ThreadLocal内存泄露
  • 3 如何避免内存泄露

1 ThreadLocal快速入门使用

ThreadLocal介绍和应用:https://blog.csdn.net/ZGL_cyy/article/details/125958690

2 ThreadLocal内存泄露

在这里插入图片描述
如果创建对象较大gc,ThreadLocal是个弱应用之后为null,Entry就会无人找到一直存在。

ThreadLocal可能导致内存泄漏,为什么?
先看看Entry的实现:

  1. static class Entry extends WeakReference<ThreadLocal<?>> {
  2. /** The value associated with this ThreadLocal. */
  3. Object value;
  4. Entry(ThreadLocal<?> k, Object v) {
  5. super(k);
  6. value = v;
  7. }
  8. }

通过之前的分析已经知道,当使用ThreadLocal保存一个value时,会在ThreadLocalMap中的数组插入一个Entry对象,按理说key-value都应该以强引用保存在Entry对象中,但在ThreadLocalMap的实现中,key被保存到了WeakReference对象中。

这就导致了一个问题,ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。

3 如何避免内存泄露

既然已经发现有内存泄露的隐患,自然有应对的策略,在调用ThreadLocal的get()、set()可能会清除ThreadLocalMap中key为null的Entry对象,这样对应的value就没有GC Roots可达了,下次GC的时候就可以被回收,当然如果调用remove方法,肯定会删除对应的Entry对象。

如果使用ThreadLocal的set方法之后,没有显示的调用remove方法,就有可能发生内存泄露,所以养成良好的编程习惯十分重要,使用完ThreadLocal之后,记得调用remove方法。

  1. ThreadLocal<String> localName = new ThreadLocal();
  2. try {
  3. localName.set("123");
  4. // 其它业务逻辑
  5. } finally {
  6. localName.remove();
  7. }

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ThreadLocal内存泄露

    内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 内存溢出 out