在多线程下,我们是经常使用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);
}
}