内存泄露相关概念
内存溢出:没有足够的内存供提供者使用。
内存泄漏:指程序中已经动态分配的内存由于各种原因程序未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果,内存泄漏的堆积最终导致内存溢出。
引用类型
java中一共有4种引用类型,强,软,弱,虚。当前这个问题主要涉及到强引用和弱引用。
强引用:就是我们常见的普通对象引用,只要还有强引用指向一个对象,就能表示这个对象还活着,垃圾回收器就不会回收这种对象。
弱引用:垃圾回收器一旦发现了只具有弱引用的对象,不管当前内存是否足够,都会回收他的内存。
如果key使用强引用
如果key使用弱引用
出现内存泄漏的原因
避免内存泄漏的方式
1.使用完ThreadLocal,调用其remove方法删除对应的Entry
2.使用完ThreadLocal,当前Thread也随之运行结果。
相比第一种方式,第二种方式显然不好控制,特别是在使用线程池的时候,线程结束是不会进行销毁的。
也就是说,只要使用完ThreadLocal及时remove,无论key是强引用还是弱引用都不会有问题的。
为什么要弱引用
在ThreadLocalMap中的get/setEntry方法中,会对key为null(也就是ThreadLocal为null)进行判断,如果为null的话,那么也会对value置为null的。
这就意味着使用完ThreadLocal,CurrentThread依然运行的前提下,就算忘记调用remove方法,弱引用也会比强引用多一层保证;弱引用的ThreadLocal被回收,对应的value在下一次
ThreadLocalMap中的get/set/remove中的任一方法的时候进行清除,从而避免内存泄漏。