问题
ThreadLocal中set进去的值在线程结束后没有remove掉会造成内存不释放 这里说的是指线程结束前不会被gc 如果线程执行时间很长 或者在线程池中的线程对象
验证
public class ThreadLocalDemo {public static void main(String[] args) {new Thread(new Runnable() {public void run() {try{//这里构造一个大对象FoobarHolder.set(new Byte[1024*1024*100]);//dosomethingSystem.out.println(FoobarHolder.get());}catch (Exception e) {}finally {//FoobarHolder.clear(); 注意这里没有调用removeSystem.gc();}}}).start();}}class FoobarHolder {static ThreadLocal<Byte[]> threadLocal = new ThreadLocal<Byte[]>();public static void set(Byte[] user){threadLocal.set(user);}public static Byte[] get(){return threadLocal.get();}public static void clear(){threadLocal.remove();}}
FoobarHolder.clear() 注释掉 运行结果如下
运行结果
[GC 416205K->410144K(661504K), 0.0016210 secs]
[Full GC 410144K->409946K(661504K), 0.5027020 secs]
很明显100M内存没有被回收
放开FoobarHolder.clear() 运行结果如下
[GC 416205K->410112K(661504K), 0.0013960 secs]
[Full GC 410112K->346K(661504K), 0.0180290 secs]
