网上一堆说内存泄漏的,想不懂为啥?
线程A 用ThreadLocal, 在线程A的Map中 put,用完这个ThreadLocal之后不应该要remove吗?
难道是说为了避免很多人没有remove导致内存泄漏?
网上一堆说内存泄漏的,想不懂为啥?
线程A 用ThreadLocal, 在线程A的Map中 put,用完这个ThreadLocal之后不应该要remove吗?
难道是说为了避免很多人没有remove导致内存泄漏?
我理解为当要销毁一个ThreadLocal对象时,如果某个线程的ThreadLocalMap已经存在了这个ThreadLocal对象作为key,如果是强引用,那么则会发生内存泄露,ThreadLocal对象不会被销毁(前提是线程一直持有这个对象)。所以这里设计成弱引用,当下一次GC时就会销毁该对象。
当然在我的工作中并没有遇到过要销毁ThreadLocal对象的时候,我一般用来做缓存使用,所以会持有一个静态的ThreadLocal,就如上面所说的是一种兜底机制吧。
4 回答1.6k 阅读✓ 已解决
4 回答1.3k 阅读✓ 已解决
1 回答2.6k 阅读✓ 已解决
3 回答2k 阅读
2 回答786 阅读✓ 已解决
2 回答1.7k 阅读
2 回答1.3k 阅读
ThreadLocal 很多时候是跨类使用,也不好确定能在什么时候删除。如果能确定的手动删除,最好的方法当然是手动删除,这样基本没有副作用。而弱引用仅仅只是一种面对危机的补偿而已,当threadlocal 没有被任何对象强引用的时候,在下一次垃圾回收的时候会清理掉,但value确没有办法,只能等下次在put的时候执行扫描,来进行清理。无论是哪种不好的情况,都属于内存泄漏吧。