java 中会存在内存泄漏问题吗?

java 中会存在内存泄漏问题吗?

有,例如使用ThreadLocal操作不当时候,会有内存泄漏的问题.

Java提供的ThreadLocal给我们编程提供了方便,但是如果使用不当也会给我们带来致命的灾难,编码时候要养成良好的习惯,线程中使用完ThreadLocal变量后,要记得及时remove掉。

ThreadLocal 分析

在Thread类中有个一个静态的内部类ThreadLocalMap,是一个Map,在这个Map中有一个Entry继承与WeakReference(弱引用)

,map的key是ThreadLocal ,value是存放的值.

注意:(注:实际上key是指向ThreadLocal类型变量的弱引用WeakReference<ThreadLocal<?>>,但可以先简单理解为ThreadLocal。)

ThreadLocal.png

为什么key使用弱引用?

我们使用threadlocal的时候例如 ThreadLocal<String> threadLocal=new ThreadLocal();在栈中有个强引用指向threadlocal,同时这个threadlocal被当前线程中的ThreadLocalMap中的key弱引用指向它,当这个栈帧弹出虚拟机栈后,即此时ThreadLocal的强引用消失,此时只有一个弱引用指向它,那么如果进行一次gc,ThreadLocal对象将被回收. 而如果key使用的强引用此时threadLoca将不会被垃圾回收,会有内存溢出的问题. 而value 使用的是强引用,如果不进行remove 操作会有内存溢出问题.

附:强引用-软引用-弱引用

  • 强引用:普通的引用,强引用指向的对象不会被回收;
  • 软引用:仅有软引用指向的对象,只有发生gc且内存不足,才会被回收;
  • 弱引用:仅有弱引用指向的对象,只要发生gc就会被回收。
# JVM   JUC   异常  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×