内存泄漏与内存溢出的区别:
内存泄漏:
使用的时候申请了内存,但该内存一直无法被释放,比如创建了ThreadLocal对象后,添加了数据此时有两个栈针指向new ThreadLocal对象,当把ThreadLocal栈针值置为空时,ThreadLocalMap中的键值也会变为空,因此内存无法被释放,所以会产生内存泄漏问题。需要注意的是,ThreadLocalMap中的键存放的是指针,因此当ThreadLocal栈针为空时,ThreadLocalMap也会为空。
内存溢出:
使用的时候申请了内存,发现内存不足,就会报错内存溢出问题。
每个线程都有自己独立的ThreadLocalMap对象,key为ThreadLocal,value为变量值。key为ThreadLocal作为Entry对象中的key,是弱引用,当ThreadLocal指向null时,Entry对象中的key也会变为null,该对象一直无法被垃圾机制回收,一直占用系统内存,有可能造成内存泄漏问题。
ThreadLocal如何防御内存泄漏问题
源码中已经帮我们处理好了,我们只需要调用remove或set方法即可。
1 每次调用remove方法会将不需要的数据移除,也就是ThreadLocalMap中键为空的数据移除;
2 每次set方法操作之前会校验key值为空的情况
ThreadLocal内存泄漏问题
最新推荐文章于 2024-04-30 20:02:16 发布