您现在的位置是:课程教程文章
java ThreadLocal内存泄漏的解决
2023-12-14 22:23课程教程文章 人已围观
-
Java毕设springboot在线电子书阅读系统 毕业
Java毕设springboot在线电子书阅读系统 毕业黄老师QQ(微信同号) 45157718... -
java,java零基础,java入门到精通,Java基础
java,java零基础,java入门到精通,Java基础购买课程后,请添加老师,领取课程中讲解到的坦克大战源码,及千万套PPT模板... -
java毕设jsp酒店预订管理系统设计与实现
java毕设jsp酒店预订管理系统设计与实现功能清单 【管理员功能】 系统设置:设置网站名称,关键字,网站描述 关于我... -
毕业设计指导公开课 Java/前端/JavaEE/分布
毕业设计指导公开课 Java/前端/JavaEE/分布【学习目标】 帮助大家完成毕业设计的同时,提升专业技能,掌握Java web开发的...
在线程中有一种方法,频繁被大家所调用,那就是 ThreadLocal。不过在内存的处理上,ThreadLocal也会遇到比较棘手的问题,总是会产生一些内存的泄漏。本篇将会以一个泄漏实例为大家展开分析,也帮助大家了解泄漏中的一些情况,并提出ThreadLocal对应的解决办法。
1、泄漏实例
ThreadLocalMap的静态内部类Entry:
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
ThreadLocalMap使用静态内部类Entry实现<k,v>存储,而Entry继承WeakReference类,所以ThreadLocalMap中的key其实是ThreadLocal的一个弱引用。
正因为ThreadLocalMap以ThreadLocal的弱引用作为key,在这个ThreadLocal没有外部强引用的时候,会被GC。这时候,ThreadLocalMap会出现一个key为null的Entry,理所当然的,这个Entry的value将永远没办法被访问到。
在这种情况下,如果当前工作线程一直没有结束,那这个key为null的value因为被Entry强引用,而Entry被当前线程的ThreadLocalMap强引用,导致这个value永远无法被GC,造成内存泄漏。
2、解决办法
ThreadLocalMap的cleanSomeSlots(),expungeStaleEntry()方法都能清除key为null的value。 在ThreadLocal的set(),get(),remove()方法中,都会调用cleanSomeSlots()或expungeStaleEntry()来清除ThreadLocalMap中所有key为null的value。
以上就是java ThreadLocal内存泄漏的解决,当然这只能对内存泄漏起到一定的作用,毕竟只是一种清楚,不能保证一定不会出现。更多Java学习指路:java教程
课程教程:java ThreadLocal内存泄漏的解决上一篇:java如何下载web文件
下一篇:没有了