标签:ThreadLocalMap 回收 ThreadLocal 线程 内存 引用
ThreadLocal提供线程局部变量。不加锁,每个线程独立获得线程共有的一份内存拷贝,不用加锁。
注意:内存泄露。
1、必须回收自定义ThreadLocal变量,尤其是在线程池场景下会被复用,如果不清理自定义ThreadLocal变量,变量值会累加。
可能会影响后续业务逻辑和造成内存泄露等问题。尤其在try-finally
ThreadLocal内有自己的实例副本,该副本只由当前线程自己使用。
Thread,ThreadLocal,ThreadLocalMap关系
Thread类中包含了ThreadLocal类,ThreadLocal类又有一个ThreadLocalMap静态内部类
通过
ThreadLocal的getMap()找到对应的ThreadLocals是一个ThreadLocalMap
当为threadLocal复制到时候,实际上是以当前threadLocal实例为key,值为value的Entry往这个threadLocalMap存放
ThreadLocalMap保存ThreadLocal对象的一个map。
ThreadLocalMap中存放的entry全是弱引用。
ThreadLocal内存泄露问题:
内存泄露:不再使用的内存,不被回收。
Java允许使用finalize()方法在垃圾收集器中将对象从内存中清除出去之前做到 必要清理工作。
1、强软弱虚
强:JVM开始垃圾回收,就算出现了OOM也不会对对象进行回收。最常见的强引用是把一个对象赋给引用变量,这个引用变量就是一个强引用。
当一个对象被强引用引用的时候,处于可达状态,它是不可能被垃圾回收的
造成内存泄露的主要原因
软:系统内存充足的时候,不会回收。
弱:对于弱引用对象,只要垃圾回收机制一运行,不管JVM内存是否充足,都会回收该对象。应用场景,避免每次都从硬盘中读取,放在内存中用软引用。
虚: 虚引用必须和引用队列联合使用(phantomreference)。
用来实现比finallize机制更灵活的回收。
标签:ThreadLocalMap,回收,ThreadLocal,线程,内存,引用 来源: https://www.cnblogs.com/Alei777/p/16411205.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。