锁定老帖子 主题:关于ThreadLocal的内存泄露
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-05
weifly 写道
yangyi 写道
那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal
public class MyClass { private static final ThreadLocal threadLocal = new ThreadLocal(); private Object value; public void myMethod() { try { threadLocal.set(value); // 业务逻辑 } finally { threadLocal.set(null); } } }
是的,这是一个怎么使用的问题,本文只是针对源码的分析,像ls说的这种使用方法是没有问题的,因为你显式的清空了threadlocal的值,文中说明的是自动回收 |
|
返回顶楼 | |
发表时间:2011-05-06
引用 那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一个废弃ThreadLocal在map中命中)时。 我对这句话一直没太明白,什么情况下,Thread会长时间不结束呢?存在大量废弃的ThreadLocal,没有被回收,就与GC有关了。 引用 Entry是针对ThreadLocal弱引用的 弱引用的话,JVM在执行内存清理工作的时候,一般情况下会回收这段空间,但是也不一定。楼主的意思是说,如果存在内存的泄露,也是跟JVM有关系是吧? 那么,这个问题就与JVM采用什么类型的回收算法,什么时候进行回收不可达对象内存空间有关了。 |
|
返回顶楼 | |
发表时间:2011-05-06
引用 Technoboy 写道 引用 那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一个废弃ThreadLocal在map中命中)时。 我对这句话一直没太明白,什么情况下,Thread会长时间不结束呢?存在大量废弃的ThreadLocal,没有被回收,就与GC有关了。 这个是应用相关的和GC没有关系,比如线程池中的线程,core size范围内 引用 Entry是针对ThreadLocal弱引用的 弱引用的话,JVM在执行内存清理工作的时候,一般情况下会回收这段空间,但是也不一定。楼主的意思是说,如果存在内存的泄露,也是跟JVM有关系是吧? 那么,这个问题就与JVM采用什么类型的回收算法,什么时候进行回收不可达对象内存空间有关了。 和GC没有关系,是一种设计上的取舍 |
|
返回顶楼 | |