1.1. ThreadLocal

概念:线程局部变量,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程智能看到自己线程的值)

  • 源码解析:
    • set方法:通过Thread.currentThread()方法获取了当前的线程引用,并传给了getMap(Thread) 方法获取一个ThreadLocalMap的实例
    • 每个Thread对象都有一个ThreadLocalMap,当创建一个ThreadLocal的时候,就会将该ThreadLocal对象添加到该Map中,其中键就是ThreadLocal,值可以是任意类型

1.1.1. ThreadLocal内存泄露问题

  • 为什么ThreadLocal会导致内存泄露

前提需要了解

  • 强引用:当JVM内存空间不足时,宁愿程序抛出OOM使程序异常终止也不愿回收具有强引用的存活者的对象
  • 弱引用:在GC的时候,不管内存空间足不足都会回收这个对象

为何会导致内存泄露?

- ThreadLocalMap中的key为ThreadLocal的弱引用:ThreadLocalMap中的Entry对象继承了WeakReference弱引用类,在Entry的构造方法中,会以key作为参数传入到父类的构造方法中

  • key为弱引用,每次GC则会回收导致key为null,但是value是强引用,垃圾回收不到也无法访问到,则会导致OOM内存溢出
  • 避免?不使用的时候,主动remove()移除
Copyright & copy lviter@163.com            updated 2024-02-06 09:54:55

results matching ""

    No results matching ""