ThreadLocal可能引起的内存泄露
来源:互联网 发布:淘宝商店如何开通花呗 编辑:程序博客网 时间:2024/05/22 09:46
ThreadLocal可能引起的内存泄露
threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法.
在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用.
每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收. 但是,我们的value却不能回收,因为存在一条从current thread连接过来的强引用. 只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.
所以得出一个结论就是只要这个线程对象被gc回收,就不会出现内存泄露,但在threadLocal设为null和线程结束这段时间不会被回收的,就发生了我们认为的内存泄露。其实这是一个对概念理解的不一致,也没什么好争论的。最要命的是线程对象不被回收的情况,这就发生了真正意义上的内存泄露。比如使用线程池的时候,线程结束是不会销毁的,会再次使用的。就可能出现内存泄露。
PS.Java为了最小化减少内存泄露的可能性和影响,在ThreadLocal的get,set的时候都会清除线程Map里所有key为null的value。所以最怕的情况就是,threadLocal对象设null了,开始发生“内存泄露”,然后使用线程池,这个线程结束,线程放回线程池中不销毁,这个线程一直不被使用,或者分配使用了又不再调用get,set方法,那么这个期间就会发生真正的内存泄露。
- ThreadLocal可能引起的内存泄露
- ThreadLocal可能引起的内存泄露
- ThreadLocal可能引起的内存泄露
- ThreadLocal可能引起的内存泄露
- 【并发】ThreadLocal可能引起的内存泄露
- ThreadLocal可能引起的内存泄露
- 内存泄露的可能引起原因
- Android 中Handler可能引起的内存泄露
- Android必知必会-Handler可能引起的内存泄露
- Handler可能引起的内存泄露及解决方案-android
- ThreadLocal的内存泄露
- ThreadLocal的内存泄露
- Android中Handler可能引起内存泄露
- CreateThread引起的内存泄露
- Backtraces引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- Handler 引起的内存泄露
- 【Android】基于Service组件的简易音乐播放器
- js打开新页面
- Appium(JAVA)Windows 7系统搭建及示例运行
- uva531
- JAVA 后台计算 经纬度 最短距离
- ThreadLocal可能引起的内存泄露
- 如何选择前端框架?
- 廖雪峰python教程
- Oracle定义DES加密解密及MD5加密函数示例
- Chewbaсca and Number
- Antimatter Ray Clearcutting uva11008
- Minimum Depth of Binary Tree
- Hibernate ORM入门03
- CodeForces 615 A. Bulbs(水~)