ThreadLocal内存泄露问题


You
You 2024-01-08 23:40:09 51357 赞同 0 反对 0
分类: 资源
在介绍内存泄露问题问题之前先介绍一下Java对象中的四种引用类型: Java对象中的四种引用类型: 强引用: 最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC并不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收

在介绍内存泄露问题问题之前先介绍一下Java对象中的四种引用类型:

Java对象中的四种引用类型:

  • 强引用: 最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC并不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收
Object obj = new Object();
  • 软引用:软引用用于描述一些还有用但并非必须保持的对象。在系统即将发生内存溢出之前,垃圾收集器会清理这些软引用指向的对象
Object obj = new Object();
SoftReference softRef = new SoftReference(obj);
  • 弱引用:表示一个对象处于可能有用且非必须的状态。在GC线程扫描内存区域时,一旦发现弱引用,就会回收到弱引用相关联的对象。对于弱引用的回收,无关内存区域是否足够,一旦发现则会被回收
Object obj = new Object();
WeakReference weakRef = new WeakReference(obj);
  • 虚引用:虚引用也称为幽灵引用,它几乎没有实际意义,主要用于跟踪对象被垃圾收集的活动;虚引用不能单独使用,必须与引用队列(ReferenceQueue)一起使用。当垃圾收集器准备回收一个对象时,如果发现它有虚引用,会把这个虚引用加入到与之关联的引用队列中
Object obj = new Object();
PhantomReference phantomRef = new PhantomReference(obj, referenceQueue);

ThreadLocal内存泄露问题

每一个Thread维护一个ThreadLocalMap,在ThreadLocalMap中的Entry对象继承了WeakReference,其中key为使用弱引用的ThreadLocal实例,value为线程变量的副本

图片[1]-ThreadLocal内存泄露问题-不念博客

ThreadLocalMap 中的 key 被设计为弱引用,原因如下

Thread 可能需要长时间运行(如线程池中的线程),如果 key 不再使用,需要在内存不足(GC)时释放其占用的内存

内存释放时机

  • 被动 GC 释放 key
    • 仅是让 key 的内存释放,关联 value 的内存并不会释放
  • 懒惰被动释放 value
    • get key 时,发现是 null key,则释放其 value 内存
    • set key 时,会使用启发式扫描,清除临近的 null key 的 value 内存,启发次数与元素个数,是否发现 null key 有关
  • 主动 remove 释放 key,value
    • 会同时释放 key,value 的内存,也会清除临近的 null key 的 value 内存
    • 推荐使用它,因为一般使用 ThreadLocal 时都把它作为静态变量(即强引用),因此无法被动依靠 GC 回收

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
YouL0
粉丝 0 资源 386 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  130
统信桌面专业版【全盘安装UOS系统】介绍  128
银河麒麟桌面操作系统安装佳能打印机驱动方法  120
银河麒麟桌面操作系统 V10-SP1用户密码修改  108
麒麟系统连接打印机常见问题及解决方法  26
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
麒麟系统连接打印机常见问题及解决方法 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益210.13元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!