太原高端网站建设,有没有人做网站,大连市自然资源局,制作手机软件介绍
每个线程内部都有一个私有的 ThreadLocalMap 实例#xff0c;用于存储该线程关联的所有 ThreadLocal 变量。 ThreadLocalMap 内部的 Entry 继承自 WeakReferenceThreadLocal?。所以**Entry 的 key#xff08;即 ThreadLocal 对象本身#xff09;是通…介绍
每个线程内部都有一个私有的 ThreadLocalMap 实例用于存储该线程关联的所有 ThreadLocal 变量。 ThreadLocalMap 内部的 Entry 继承自 WeakReferenceThreadLocal?。所以**Entry 的 key即 ThreadLocal 对象本身是通过弱引用指向的**。
Entry 中的 value 字段始终保持着对实际存储值的强引用。
内存泄漏问题分析
当一个 ThreadLocal 对象也就是key在应用程序中不再被任何强引用指向时例如声明它的类实例被回收或者局部变量超出作用域在下一次垃圾回收GC时这个弱引用 会被回收此即GC 会回收这个 ThreadLocal 对象Entry 中的 key 会变为 null。但是value被 Entry 强引用着只要线程不死当前线程ThreadLocalMap的Entry一直强引用者value。假设是长期存活的线程池中的线程这种泄漏可能会不断累积最终可能导致 OutOfMemoryError。
防止内存泄漏方法
在使用完毕后调用 ThreadLocal.remove()remove() 放在 finally 块中执行确保无论代码逻辑是否发生异常都能清理资源。将 ThreadLocal 定义为 private static final这本身不会导致泄漏ThreadLocal因为强引用在类上用完之后必须主动remove