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