ThreadLocal为啥会内存泄漏?总结一句话就是,因为强应引用导致 不会再被使用的Entry的value所持有的对象一直无法释放。
1、当ThreadLocal=null了,引用断了
2、这里是弱应用,一GC(垃圾回收),也断了。之所以是弱应用,是有几率被垃圾回收,然后被ThreadLocalMap发现key没有引用,从而将这个key value 回收。如果是强引用就完犊子了。就算ThreadLocal Ref不引用他,Key对他的引用还是亘古不灭,所以这个弱引用做得真好,给这条狗栓两个绳,一强一弱。
3、都没有人会再用key了,但是我的Entry还是没被回收,虽然我调用set()或者get()时会可能出发expungStaleEntry()这个玩意就是把key应用为空的entry回收,但是偶发呀,你看下边都是强引用狗链条,所以只要我thread一天不死,这玩意就活着。那么一个50MB(我随便写的)永远无法释放,如果10个就是500M,那么内存泄漏就有可能。
4、那么怎么样才能保证不犯ThreadLocal内存泄漏呢?不用的时候就把50Mvalue给remove嘛。remove直接调用expungStaleEntry()