在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出
来源:互联网 发布:photoshop8.0软件下载 编辑:程序博客网 时间:2024/06/10 07:59
这里使用的servlet容器是 tomcat
如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。
说明原因前
1:先讲一下 ThreadLocal,Thead,ThreadLocalMap 三者之间的一个关系。(大家可以去看一下ThreadLocal的实现源码,可而参考我的另一篇文章点击查看)
ThreadLocalMap 是 ThreadLocal 的一个内部类,一看是Map,保存数据的形式就是key value 形式的。
Thread类有一个成员变量 threadLocals,这个变量的数据类型是 ThreadLocal.ThreadLocalMap。threadLocals保存数据的key是ThreadLocal本身
2:tomcat线程池
tomcat启动的时候会创建一个线程池,配置如下
<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700"connectionTimeout="20000" redirectPort="8443" />
maxThreads=”600” ///最大线程数
minSpareThreads=”100”///初始化时创建的线程数
maxSpareThreads=”500”///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount=”700”//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
这里说一下为什么 如果在web项目中,使用 ThreadLocal 不当,会造成 OutOfMemoryError。
如果调用 ThreadLocal 的 set 方法 将一个对象放入Thread中的成员变量threadLocals 中,那么这个对象是永远不会被回收的,因为这个对象永远都被Thread中的成员变量threadLocals引用这。
如果想让垃圾收集器回收它,有两种方法
1:将该线程从tomcat线程池中去除,当一个线程被回收的时候何况它的成员变量呢,但是tomcat启动一般都会配置一个线程池进行优化,所有该方法不太现实。
2:调用 ThreadLocal 的 remove 方法 将对象从hread中的成员变量threadLocals 中删除掉。
设想如果将一个大对象放入threadLocals 中,并且还没有remove。那么就可能会造成OutOfMemoryError,如果不会造成OutOfMemoryError那么也很浪费java堆内存
- 在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出
- spring 使用不当会造成存溢出
- C/C++中容易造成内存溢出的函数
- C/C++中容易造成内存溢出的函数
- C/C++中容易造成内存溢出的函数
- C/C++中容易造成内存溢出的函数
- 避免使用不当pthread_create函数造成内存泄露
- 一张图看懂block使用不当造成内存泄露
- 大量使用kmalloc容易造成内存浪费
- 使用Handler需要谨慎,否则可能造成内存泄漏
- java多线程使用不当造成的问题
- 在LoaderCallbacks中使用CursorAdapter造成的内存泄露问题
- (1.1.26)C/C++中容易造成内存溢出的函数
- 在oracle中要谨慎使用when others then
- [JAVA]在Web应用中ThreadLocal的使用
- ThreadLocal在WEB系统中使用遇到的问题
- Android-浅析Android消息处理机制使用不当造成的内存泄漏
- 项目经验----触发器要谨慎使用
- java发送http的get、post请求
- 全局引用和本地引用
- Android进阶——RecycleView的使用之自定义聊天界面(三)
- Java面试题大全
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- 在web项目中使用 ThreadLocal 要谨慎,使用不当容易造成内存溢出
- php几种根据生日计算年龄的方法
- Qt5的widget项目文件解析
- UE4中蓝图转换成C++代码
- android 主题兼容问题
- 视频课程-前端开发
- nginx.org的Command-line parameters页面翻译
- IDEA Properties中文unicode转码问题
- 为什么要使用Google Protocol Buffers