网站建设前期策划书,做直播哪个网站好,贸易公司注册资金多少合适,镇江网站建设报价目录 1 ThreadLocal快速入门使用2 ThreadLocal内存泄露3 如何避免内存泄露 1 ThreadLocal快速入门使用
ThreadLocal介绍和应用#xff1a;https://blog.csdn.net/ZGL_cyy/article/details/125958690
2 ThreadLocal内存泄露 如果创建对象较大gc#xff0c;ThreadLocal是个弱… 目录 1 ThreadLocal快速入门使用2 ThreadLocal内存泄露3 如何避免内存泄露 1 ThreadLocal快速入门使用
ThreadLocal介绍和应用https://blog.csdn.net/ZGL_cyy/article/details/125958690
2 ThreadLocal内存泄露 如果创建对象较大gcThreadLocal是个弱应用之后为nullEntry就会无人找到一直存在。
ThreadLocal可能导致内存泄漏为什么 先看看Entry的实现
static class Entry extends WeakReferenceThreadLocal? {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal? k, Object v) {super(k);value v;}
}通过之前的分析已经知道当使用ThreadLocal保存一个value时会在ThreadLocalMap中的数组插入一个Entry对象按理说key-value都应该以强引用保存在Entry对象中但在ThreadLocalMap的实现中key被保存到了WeakReference对象中。
这就导致了一个问题ThreadLocal在没有外部强引用时发生GC时会被回收如果创建ThreadLocal的线程一直持续运行那么这个Entry对象中的value就有可能一直得不到回收发生内存泄露。
3 如何避免内存泄露
既然已经发现有内存泄露的隐患自然有应对的策略在调用ThreadLocal的get()、set()可能会清除ThreadLocalMap中key为null的Entry对象这样对应的value就没有GC Roots可达了下次GC的时候就可以被回收当然如果调用remove方法肯定会删除对应的Entry对象。
如果使用ThreadLocal的set方法之后没有显示的调用remove方法就有可能发生内存泄露所以养成良好的编程习惯十分重要使用完ThreadLocal之后记得调用remove方法。
ThreadLocalString localName new ThreadLocal();
try {localName.set(123);// 其它业务逻辑
} finally {localName.remove();
}