当前位置: 代码迷 >> 综合 >> ThreadLocal 的好习惯 remove
  详细解决方案

ThreadLocal 的好习惯 remove

热度:31   发布时间:2024-01-20 17:46:03.0

在多线程下,我们是经常使用ThreadLocal的,手动remove是一个好习惯,否则可能导致内存泄露

为了便于观察,我们使用堆栈溢出的方式查看内存泄露(因内存泄露导致oom)

idea中运行参数  -Xms20M -Xmx20M -XX:+PrintGCDetails

在t1中如果没有remove,gc是无法清理掉对象的

public class M {public static void main(String[] args) {ThreadLocal<Object> tl=new ThreadLocal<>();new Thread(()->{tl.set(new Byte[1024*1024*1]);tl.remove();// 如果注释掉,会存在内存泄露,进而导致堆栈溢出System.out.println(tl.get());try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}},"t1").start();new Thread(()->{try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}tl.set(new Byte[1024*1024*4]);System.out.println(tl.get());},"t2").start();System.out.println(tl);}
}

 

  相关解决方案