ThreadLocal 内存泄漏问题
本文说说ThreadLocal由于使用不当造成的内存泄漏问题
Thead和ThreadLocal的内存状况如下图,不了解的同学参考: 图解ThreadLocal核心原理
如果线程太多,每个线程的value值都很大,是不是会造成内存溢出,写个程序模拟一下OOM的场景
1、程序模拟一下OOM
public class ThreadLocalTest {public static void main(String[] args) throws InterruptedException {testOOM();}private static void testOOM() throws InterruptedException {int nThreads = 101;ExecutorService executorService = Executors.newFixedThreadPool(nThreads);for (int i = 0; i < nThreads; i++) {executorService.execute(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName());threadLocal.set(new BigObject());// 业务处理}});}Thread.sleep(10 * 1000);}static class BigObject {byte[] _1M_bytes = new byte[1024 * 1024];}
}
//
使用 -Xms100m -Xmx100m
参数运行程序
java.lang.OutOfMemoryError: Java heap spaceat com.yh.stu.rocketmq.ThreadLocalTest$BigObject.<init>(ThreadLocalTest.java:67)at com.yh.stu.rocketmq.ThreadLocalTest$1.run(ThreadLocalTest.java:28)
2、ThreadLocal OOM原因分析
为什么会OOM?因为线程池有101个线程,每一个线程都会有个Map,每个Map中存放了1M大小的对象,当循环执行到100左右的时候,堆内存就放满了,再向线程中放入Map时就OOM了
解决办法 :在// 业务处理
的后面加入threadLocal.remove()
,就不会OOM了,垃圾回收器会回收线程中的new BigObject()
对象的空间
3、Thread中的 Map
从前文中我们感觉到,用户的数据是存在Thread的Map中的,ThreadLocal对象只是作为Map的key的方式存在着
key是虚引用,内存不够垃圾回收时会回收,但value却不会, 看下图
执行 threadLocal.remove()
方法,将引用置为null,value对应的对象BigObject
没有引用指向它,可以被回收
附录-WeakReference使用
运行参数 -Xms100m -Xmx100m
public static void testWeakReference() throws InterruptedException {while(true){new Thread(){@Overridepublic void run() {WeakReference<BigObject> wref= new WeakReference<>(new BigObject());try {Thread.sleep(Long.MAX_VALUE);} catch (InterruptedException e) {e.printStackTrace();}}}.start();Thread.sleep(100);}
}
这个程序不会造成内存溢出,因为弱引用在内存不足时会被垃圾回收器回收
ThreadLocal 内存泄漏问题相关推荐
- 深入分析 ThreadLocal 内存泄漏问题
转载自 http://www.importnew.com/22039.html ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件 ...
- 【java】ThreadLocal 内存泄漏 代码演示 实例演示
1.概述 转载:ThreadLocal 内存泄漏 代码演示 实例演示 首先看文章:ThreadLocal内存泄露原因分析 相关文章: [高并发]ThreadLocal.InheritableThrea ...
- 【转载】深入分析 ThreadLocal 内存泄漏问题
前言 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可 ...
- 聊一聊ThreadLocal内存泄漏的问题
回答任何一个问题的时候应该要遵循:明确题意-->深入浅出-->举例说明-->总结,这四个步骤很重要,可以让你沉着冷静,思路清晰,避免尴尬. 01 - 明确题意 明确题意的意思就是先 ...
- ThreadLocal内存泄漏原理解析
1.什么是内存泄漏问题? 内存泄漏 表示就是我们申请了内存,但是该内存一直无法释放: 内存泄漏会导致内存溢出问题: 申请内存时,发现申请内存不足,就会报错 : 2.在介绍ThreadLocal内存泄漏 ...
- ThreadLocal内存泄漏问题
ThreadLocal可以存取各线程专属的变量副本,底层是通过ThreadLocalMap实现,存的K-V K:WeakReference弱引用 V:变量副本 一旦某线程长期存活,但ThreadLoc ...
- Java并发编程笔记之ThreadLocal内存泄漏探究
使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: /*** Created by cong on 2018/7/14.*/ publi ...
- 关于ThreadLocal内存泄漏的问题
什么是ThreadLocal? ThreadLoal 变量,线程实例变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本.这里有几点需要注意: 因为每个 Thre ...
- c++ thread 内存泄漏_深入剖析ThreadLocal原理、内存泄漏及应用场景
本文主要针对JDK1.8讲解 ThreadLocal作用 先看一个简单的示例,创建两个线程,第一个线程向ThreadLocal中写入数据,第二个线程等待第一个线程完成从ThreadLocal中读取数据 ...
最新文章
- 「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制
- cisco路由器基本实验之一 静态路由的配置(Boson NetSim
- 【Java】【Fulme】Flume-NG源代码阅读之SpoolDirectorySource
- USACO 5.2.2 fence3
- 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第4节 模拟BS服务器案例_2_模拟BS服务器代码实现...
- 分布式系统设计之DB类(来自深空老大)
- sm4 前后端 加密_sm4加密
- 科技部领衔发布中国新一代AI发展报告:中美成全球AI网络核心节点
- HDU-5053 the Sum of Cube
- 地球到火星的通信问题
- TM32F103C8T6(晶振电路,复位电路,调试下载串口详解)
- C#实现给图片加边框的方法
- GPRS附着,PDP激活失败
- Ubuntu22.04.1无法找到Ubuntu软件中心-Ubuntu Software
- 收藏.IBM.某高手点评IBM历年试题
- 简单的爬取某租房网站租房信息并存入MySQL数据库
- GNN-图卷积模型-2016:GCN【消息传递(前向传播):聚合函数+更新函数】【聚合函数:mean(邻域所有节点取平均值)】【训练更新函数的参数】【空域+频域】【直推式学习】【同质图】
- mac电脑使用普通键盘截图,全选,拷贝(复制),移动文件的快捷键是什么?
- 【Laravel笔记】12. 模型的预加载
- Git 之二 架构、工作流程、.git 目录文件
热门文章
- [Teamcenter 2007 开发实战] 获取错误或提示信息
- EMC-- DFC --Sessions and Session Managers
- JVM内存分析及导致内存溢出的不健壮代码及解决办法
- php curl exec ch,PHP curl_exec函数的用法实例详解
- css img 适配尺寸_img图片自适应布局_HTML5教程_郭隆邦技术博客
- oracle 自定义类型使用方法,oracle pl/sql中使用自定义数据类型
- Linux中Docker部署Redis
- Python 对字典循环遍历的两种方式
- Spring Boot 发送邮件
- 【老军医方】在脱发过程中遇到的各种疑难杂症