网站需要服务器,佛山网站设计定制,外文网站搭建公司,wordpress购买会员资格首先ThreadLocal是什么就不介绍了#xff01;这篇是讲讲里面的东西。
再简单说一下强引用和弱引用#xff0c;举个例子#xff0c;我们平常new出来的对象就是强引用的#xff0c;在栈中有强引用#xff0c;所以在gc的时候#xff0c;堆中的实例对象不会被清除掉。
弱引…首先ThreadLocal是什么就不介绍了这篇是讲讲里面的东西。
再简单说一下强引用和弱引用举个例子我们平常new出来的对象就是强引用的在栈中有强引用所以在gc的时候堆中的实例对象不会被清除掉。
弱引用如果一个对象只有被弱引用在发生gc的时候就会被清除掉原先的弱引用就会指向null。
使用ThreadLoal都有哪些对象会出现泄漏 1、ThreadLocal对象实例 2、ThreadLocalMap中的Entry对象 3、Entry对象中value的具体指向
具体 1、ThreadLocal对象实例有两个引用假如两个都是强引用一个是栈中的引用一个是Entry中的key引用。当业务代码执行完用完ThreadLocal栈中这个引用关系就清除掉此时ThreadLocal实例还被key引用key在Entry中Entry在ThreadLocalMap中Map的引用是当前线程当前线程存在那么这一系列Map–Entry–key,value–ThreadLocal都不会被清除掉。 所以设计了key是个弱引用当栈中的强引用关系清除后key的弱引用随时被gc掉不会影响ThreadLocal实例对象被清除。
2、在jdk自己解决了ThreadLocal实例内存泄漏的问题了那么Entry呢 在前面ThreadLoacl对象被gc了那么这个key就变成了null。线程、Map一直存在但是Entry用不到了也一直被引用着所以这个需要使用Remove方法这个方法是将Entry从Map中移除前提是这个key引用ThreadLocal还在不然找不到这个Entry。如果都等到ThreadLocal对象被gc掉那么Map中就会出现很多的key为null的Entry。 所以remove()方法是为了防止Entry对象泄漏的。 在理论是不允许出现key为null的Entry的但实际上还是避免不了所以ThreadLocalMap对此也做了优化ThreadLocalMap在每次调用set()、get()、remove()方法时都会进行清理以确保不存在key为null的Entry。 但是为了能够及时清理无用的Entry一定要使用remove方法不要占着内存导致大量内存泄漏。
3、在Entry溢出的时候value自然是溢出的合理使用remove方法避免溢出
在这里想问一下大家几个问题一、什么时候会出现栈中ThreadLocal引用关系清除了但是当前线程还在 二、如果都不使用remove()方法线程结束后ThreadlocalMap会被清除掉吗还会出现内存泄漏吗