问题
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]);
//dosomething
System.out.println(FoobarHolder.get());
}catch (Exception e) {
}finally {
//FoobarHolder.clear(); 注意这里没有调用remove
System.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]