原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html
内存泄漏是指不再使?的对象?法得到及时的回收,持续占?内存空间,从?造成内存空间的浪费。
内存溢出则是发?了OutOfMemoryException,内存溢出的情况有很多,例如堆内存空间不?,栈空间不?,还有?法区空间不?等都会导致内存溢出。
内存泄漏很容易导致内存溢出,但内存溢出不?定是内存泄漏导致的。
ThreadLocal是基于ThreadLocalMap实现的,这个Map的Entry继承了WeakReference,?Entry对象中的key使?了WeakReference封装,也就是说Entry中的key是?个弱引?类型,?弱引?类型只能存活在下次GC之前。
如果?个线程调?ThreadLocal的set设置变量,当前ThreadLocalMap则会新增?条记录,但由于发?了?次垃圾回收,此时的key值就会被回收,?value值依然存在内存中,由于当前线程?直存在,所以value值将?直被引?。
这些被垃圾回收掉的key就会?直存在?条引?链的关系:Thread -> ThreadLocalMap -> Entry -> value。这条引?链会导致Entry不会被回收,value也不会被回收,但Entry中的key却已经被回收的情况发?,从?造成内存泄漏。
我们只需要在使?完该key值之后,将value值通过remove?法remove掉,就可以防?内存泄漏了。
https://time.geekbang.org/column/article/109201
原文:https://www.cnblogs.com/agilestyle/p/11421437.html