ThreadLocal内存泄漏一看就懂

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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容