关于 ThreadLocal 的疑问

捏造的信仰 2007-02-26 11:21:11
我想知道当线程结束后,相应的 ThreadLocal 对象是否会被释放?我写了一个测试:

import java.util.Date;

/**
* 测试大量 ThreadLocal 是否被释放
*
* @author yidinghe
*/
public class TestLargeAmountThreadLocals extends Thread {

private static ThreadLocal cache = new ThreadLocal();

public void run() {
cache.set(new Date());
}

public static void main(String[] args) throws Exception {
long mem0 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
for (int i = 0; i < 1000; i++) {
new TestLargeAmountThreadLocals().start();
}
Thread.sleep(5000);
long mem1 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("usage: " + (mem1 - mem0));
}
}

测试结果却是:
usage: -17736

我不知道这是怎么回事。
...全文
322 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
congdepeng 2008-11-24
  • 打赏
  • 举报
回复
long mem0 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
for (int i = 0; i < 1000; i++) {
new DepengTest().start();
}
Thread.sleep(5000);
long mem1 = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

System.out.println( " before exeute used : " + mem1 );
System.out.println( "after exeute used : " + mem0 );



这样写是谁减去谁 看清楚了? System.out.println( "usage: " + (mem1 - mem0));


应该是 (mem0 - mem1)
阿光老师 2008-10-21
  • 打赏
  • 举报
回复
usage: 2617768
sswhsz 2007-02-26
  • 打赏
  • 举报
回复
结果是个负数,的确比较奇怪,一开始我以为是没有调用GC的缘故,
结果:没有调用GC的话,返回结果是正数,
调用GC以后,返回结果负数,和预期的结果恰好相反。
sswhsz 2007-02-26
  • 打赏
  • 举报
回复
当线程结束后,ThreadLocal 会被释放。

不过,你测试的结果返回一个负数,我也不知道怎么回事。

----------------
ThreadLocal 的值实际上保存在Thread.threadLocals变量里。当线程结束时,会调用
Thread.exit()方法,在这个方法里,执行了threadLocals = null;这条语句。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧