论坛首页 Java企业应用论坛

关于ThreadLocal的内存泄露

浏览 15769 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-05-05  
weifly 写道
yangyi 写道
那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal



存在大量废弃的ThreadLocal很有可能说明程序设计有问题吧?ThreadLocal一般是static的,只要类不被回收,那ThreadLocal也不会回收的啊,也就不存在废弃的说法了。

在finally中清空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的值,文中说明的是自动回收

0 请登录后投票
   发表时间:2011-05-06  
引用

那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一个废弃ThreadLocal在map中命中)时。

我对这句话一直没太明白,什么情况下,Thread会长时间不结束呢?存在大量废弃的ThreadLocal,没有被回收,就与GC有关了。

引用

Entry是针对ThreadLocal弱引用的

弱引用的话,JVM在执行内存清理工作的时候,一般情况下会回收这段空间,但是也不一定。楼主的意思是说,如果存在内存的泄露,也是跟JVM有关系是吧?
那么,这个问题就与JVM采用什么类型的回收算法,什么时候进行回收不可达对象内存空间有关了。
0 请登录后投票
   发表时间:2011-05-06  
引用
Technoboy 写道
引用

那么何时会“内存泄露”?当Thread长时间不结束,存在大量废弃的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一个废弃ThreadLocal在map中命中)时。

我对这句话一直没太明白,什么情况下,Thread会长时间不结束呢?存在大量废弃的ThreadLocal,没有被回收,就与GC有关了。

这个是应用相关的和GC没有关系,比如线程池中的线程,core size范围内
引用

Entry是针对ThreadLocal弱引用的

弱引用的话,JVM在执行内存清理工作的时候,一般情况下会回收这段空间,但是也不一定。楼主的意思是说,如果存在内存的泄露,也是跟JVM有关系是吧?
那么,这个问题就与JVM采用什么类型的回收算法,什么时候进行回收不可达对象内存空间有关了。

和GC没有关系,是一种设计上的取舍
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics