原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html
内存泄漏
内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽造成内存空间的浪费。
内存溢出
内存溢出则是发⽣了OutOfMemoryException,内存溢出的情况有很多,例如堆内存空间不⾜,栈空间不⾜,还有⽅法区空间不⾜等都会导致内存溢出。
内存泄漏与内存溢出的关系
内存泄漏很容易导致内存溢出,但内存溢出不⼀定是内存泄漏导致的。
ThreadLocal内存泄漏
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掉,就可以防⽌内存泄漏了。