ThreadLocal问题记录

ThreadLocal问题记录

问题

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]

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×