问题

ThreadLocal中set进去的值在线程结束后没有remove掉会造成内存不释放 这里说的是指线程结束前不会被gc 如果线程执行时间很长 或者在线程池中的线程对象

验证

  1. public class ThreadLocalDemo {
  2. public static void main(String[] args) {
  3. new Thread(new Runnable() {
  4. public void run() {
  5. try{
  6. //这里构造一个大对象
  7. FoobarHolder.set(new Byte[1024*1024*100]);
  8. //dosomething
  9. System.out.println(FoobarHolder.get());
  10. }catch (Exception e) {
  11. }finally {
  12. //FoobarHolder.clear(); 注意这里没有调用remove
  13. System.gc();
  14. }
  15. }
  16. }).start();
  17. }
  18. }
  19. class FoobarHolder {
  20. static ThreadLocal<Byte[]> threadLocal = new ThreadLocal<Byte[]>();
  21. public static void set(Byte[] user){
  22. threadLocal.set(user);
  23. }
  24. public static Byte[] get(){
  25. return threadLocal.get();
  26. }
  27. public static void clear(){
  28. threadLocal.remove();
  29. }
  30. }

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]