ThreadLocal内存泄露原因,如何避免

内存泄露为程序在申请内存后,无法释放已经申请的内存空间,一次内存泄露可以忽略,但是内存泄露堆积后果很严重,无论多少内存迟早被用光。

不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。

强引用:使用最普遍的引用(new), 一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使得程序异常终止,也不会回收这个对象。

如果想取消强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。

弱引用:JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在Java中,用java.lang.ref.WeakReference类来表示,可以再缓存中使用弱引用。

ThreadLocal的实现原理,每一个Thread维护一个ThreadLocalMap,key为弱引用的Thread实例,value为线程变量的副本。

ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal不存在外部强引用时,key(ThreadLocal)势必会被GC回收,这样就会导致ThreadLocalMap中key为null,而value还存在着强引用,只有当thread线程退出以后value的强引用链才会断掉,但如果当前线程迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链。

如果ThreadLocalMap的key使用强引用,因为ThreadLocalMap还持有ThreadLocal的强引用,如果没有手动删除,ThreadLocal不会被回收,导致Entry内存泄露。

当ThreadLocalMap的key为弱引用回收ThreadLocal对象时,由于ThreadLocalMap持有ThreadLocal的弱引用,即使没有手动删除,ThreadLocal也会被回收。当key为null时,在下一次ThreadLocalMap调用set(),get(),remove()方法时就会清除value值。

因此,ThreadLocal内存泄露的根源:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄露,而不是因为弱引用。

ThreadLocal正确的使用方法
(1)每次使用完ThreadLocal都调用它的remove()方法清楚数据
(2)将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到entry的value值,进而清除掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握无人机遥感数据预处理的全链条理论与实践流程、典型农林植被性状的估算理论与实践方法、利用MATLAB进行编程实践(脚本与GUI开发)以及期刊论文插图制作等

目录 专题一 认识主被动无人机遥感数据 专题二 预处理无人机遥感数据 专题三 定量估算农林植被关键性状 专题四 期刊论文插图精细制作与Appdesigner应用开发 近地面无人机植被定量遥感与生理参数反演 更多推荐 遥感技术作为一种空间大数据手段,能够从多时、多…

LayUi之手风琴的趣味案例

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.手风琴是什么 二.手风琴在什么时候使用…

Vue 3 功能实现

Vue 3 功能实现 本论旨在研究和分析 Vue 3 的功能实现,深入探讨 Vue 3 作为下一代前端开发框架的特色与创新。论文首先介绍了 Vue 3 的背景和发展历程,随后重点讨论了其引入的核心功能和改进之处,包括响应式系统的全面重构、Composition API…

性能测试之性能问题分析

开始性能测试前需要了解的内容: 1、项目具体需求。 2、指标:响应时间在多少以内,并发数多少,tps多少,总tps多少,稳定性交易总量多少,事务成功率,交易波动范围,稳定运行时…

浅谈chatgpt如何改变人们生活

ChatGPT,作为一种自然语言处理模型,确实有潜力改变人们的生活。以下是ChatGPT如何可能改变人们生活的几个方面:1.智能助手和客户支持:ChatGPT可以作为智能助手嵌入到各种应用中,为用户提供即时的帮助和解答问题。在客户…

【iOS】—— 面向对象,Runtime,ARC等问题总结

对于暑假学习大多数是对之前学习的一个复习,在这里只做对之前学习欠缺知识的补充以及这些知识点涉及的一些问题,从问题入手学习。 文章目录 面向对象1.一个NSObject对象占多少内存?2.对象的isa指针指向哪里?3.OC的类信息存放在哪…

spring复习:(41)全注解方式的事务

一、创建事务、数据源相关的配置类: package cn.edu.tju.study.service.transaction;import com.zaxxer.hikari.HikariDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import or…

诚迈科技子公司智达诚远精耕智能驾驶,为商用落地注入创新力量

近期,工业和信息化部副部长辛国斌在新闻发布会上表示,将启动智能网联汽车准入和上路通行试点,组织开展城市级“车路云一体化”示范应用,将支持L3级及更高级别的自动驾驶功能商业化应用。根据工信部最新消息,《智能网联…

使用matlab中的SVM进行数据回归预测

在MATLAB中使用支持向量机(SVM)进行数据回归预测,你可以遵循以下步骤: 准备数据集: 将你的特征矩阵X和目标变量向量y加载到MATLAB工作空间中。确保X和y的维度匹配。 拆分数据集: 将数据集划分为训练集和测…

AI编程助手体验

一、背景 最近在接触各种AI插件,用copilot的话要10美元每月,太贵,就下载了清华的CodeGeeX 刚好,有个需求,需要将枚举的所有值,随机组合求和,并返回所有组合之和。 ”假设你有一个名为 enum_v…

实际上手体验maven面对冲突Jar包的加载规则 | 京东云技术团队

一、问题背景 相信大家在日常的开发过程中都遇到过Jar包冲突的问题,emm,在最近处理业务需求时我也遇到了不同版本jar包冲突导致项目加载出错的问题。主要是一个完整的项目会不可避免的使用第三方的Jar包来实现功能开发,各种第三方包之间可能…

大数据篇Kafka消息队列指定Topic打印Key、Value、Offset和Partition

1、概念简介 说到Apache Kafka消息传递系统时,以下是一些关键概念的解释: Key(键):Kafka消息由Key和Value组成。Key是一个可选的字段,它通常用于消息的路由和分区策略。Key的目的是确保具有相同Key的消息…

Python 3 拷贝、浅拷贝、直接引用

诸神缄默不语-个人CSDN博文目录 复杂的以后再补。 总的来说,像常数、字符串这种比较简单的变量无所谓,但是对于一些复杂对象(比如list等),如果直接使ba,相当于直接把a的路径给了b,b这个对象的…

day35-Postman/ajax

0目录 1.postman 2.ajax 1.Postman 1.1 定义:postman用于测试http协议接口,无论是开发还是测试人员 1.2 Servlet中的doGet()/doPost…

建造者模式-复杂对象的组装与创建

生产一辆车,主要有以下步骤:安装骨架、安装发动机及安装轮胎。这些步骤有指定的执行顺序,步骤缺一不可。 图 传统方案 传统方案存在的问题: 传参不便,虽可在构造函数那传参,但是传参时需要注意参数顺序等…

出租屋智能电表系统

随着科技的不断发展,智能化逐渐成为人们生活中不可或缺的一部分。在房屋租赁市场中,智能电表系统成为越来越多出租屋的标配,为房东和租户带来了便捷和安全。本文将从以下几个方面介绍出租屋智能电表系统的特点和优势。 一、出租屋智能电表系统…

LCD-STM32液晶显示中英文-(7.字模及显示原理)

目录 字模介绍 什么是字模 字模的构成 字模显示原理 字模制作 如何制作字模 字模寻址公式 存储字模文件 字模介绍 什么是字模 有了编码,我们就能在计算机中处理、存储字符了,但是如果计算机处理完字符后直接以编码的形式输出,人类将难…

Flutter:网络图像缓存插件——cached_network_image

前言 为什么要使用这个插件,有什么用呢?毕竟官方提供了Image.network来进行网络图片加载 Image.network和CachedNetworkImage都可以用于在Flutter中加载网络图片,但它们之间有一些区别。 Image.network是Flutter核心库提供的一个构造函数&…

体外诊断相关介绍-博迈伦IVD原料供应商

摘要:体外诊断是在人体之外进行检测而获取临床诊断信息的一种诊断方法,它是现代医学广泛使用的诊断方法。体外诊断的范畴很广,按照检测原理或检测方法,体外诊断可以分为生化诊断、免疫诊断、分子诊断、微生物诊断、血液体液诊断五…

Java性能优化-测试try-catch放在循环内和外的性能对比与业务区别

场景 Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化: Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_霸道流氓气质的博客-CSDN博客 使用如上方式测试Java中try-catch放在循环内和循环外是否有性…