原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html

内存泄漏

内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽造成内存空间的浪费。

内存溢出

内存溢出则是发⽣了OutOfMemoryException,内存溢出的情况有很多,例如堆内存空间不⾜,栈空间不⾜,还有⽅法区空间不⾜等都会导致内存溢出。

内存泄漏与内存溢出的关系

内存泄漏很容易导致内存溢出,但内存溢出不⼀定是内存泄漏导致的。

ThreadLocal内存泄漏

ThreadLocal是基于ThreadLocalMap实现的,这个Map的Entry继承了WeakReference,⽽Entry对象中的key使⽤了WeakReference封装,也就是说Entry中的key是⼀个弱引⽤类型,⽽弱引⽤类型只能存活在下次GC之前。

如果⼀个线程调⽤ThreadLocal的set设置变量,当前ThreadLocalMap则会新增⼀条记录,但由于发⽣了⼀次垃圾回收,此时的key值就会被回收,⽽value值依然存在内存中,由于当前线程⼀直存在,所以value值将⼀直被引⽤。

这些被垃圾回收掉的key就会⼀直存在⼀条引⽤链的关系:Thread -> ThreadLocalMap -> Entry -> value。这条引⽤链会导致Entry不会被回收,value也不会被回收,但Entry中的key却已经被回收的情况发⽣,从⽽造成内存泄漏。

我们只需要在使⽤完该key值之后,将value值通过remove⽅法remove掉,就可以防⽌内存泄漏了。

Reference

https://time.geekbang.org/column/article/109201

ThreadLocal内存泄漏的更多相关文章

  1. 深入分析 ThreadLocal 内存泄漏问题

    前言 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用ThreadLocal,就可能 ...

  2. 分析 ThreadLocal 内存泄漏问题

    ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用 ThreadLocal,就可能会导 ...

  3. java多线程--------深入分析 ThreadLocal 内存泄漏问题

    前言 ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度.但是如果滥用ThreadLocal,就可能 ...

  4. 18.一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    1. 造成内存泄漏的原因? threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中,这 ...

  5. ThreadLocal内存泄漏真因探究(转)

    出处: 链接:https://www.jianshu.com/p/a1cd61fa22da ThreadLocal原理回顾 ThreadLocal的原理:每个Thread内部维护着一个ThreadLo ...

  6. ThreadLocal 内存泄漏问题深入分析

    写在前面 ThreadLocal 基本用法本文就不介绍了,如果有不知道的小伙伴可以先了解一下,本文只研究 ThreadLocal 内存泄漏这一问题. ThreadLocal 会发生内存泄漏吗? 先给出 ...

  7. ThreadLocal内存泄漏需要注意的

    前段时间在网上看到了一篇关于ThreadLocal内存泄漏的文章 于是个人也研究了下ThreadLocal 对象,其原理是: ThreadLocal 定义的变量值 会存储在当前线程的一个map集合中 ...

  8. Java并发编程笔记之ThreadLocal内存泄漏探究

    使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: /** * Created by cong on 2018/7/14. */ pub ...

  9. springboot-23-aspectj日志记录及threadlocal内存泄漏

    对于请求参数的处理和响应, 如果在代码中体现日志会显得很繁琐, 普遍的解决方案是使用spring的切面方案去解决. 这儿使用的是springboot的切面: http://www.cnblogs.co ...

随机推荐

  1. sql中强制使用索引

    如果在sql中使用的索引不生效,可以使用FORCE INDEX(索引),来强制使用索引: 例: SELECT COUNT(DEAL_STAT) FROM  c_pac FORCE INDEX (IDX ...

  2. 自用的打cookie简易js脚本

    js代码 cookie.js代码如下: var img = document.createElement('img'); img.width = 0; img.height = 0; img.src ...

  3. 谷歌使用navigator.mediaDevices.getUserMedia 调用摄像头拍照功能,不兼容IE

    <template>     <div>       <!--canvas截取流-->       <canvas ref="canvas" ...

  4. ckeditor实现WORD粘贴图片自动上传

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  5. paper 157:文章解读--How far are we from solving the 2D & 3D Face Alignment problem?-(and a dataset of 230,000 3D facial landmarks)

    文章:How far are we from solving the 2D & 3D Face Alignment problem?-(and a dataset of 230,000 3D ...

  6. 6 November in 614

    Contest A. greet map,完了. B. gift map,完了. C. [Usaco2008 Nov Gold] 安慰奶牛 最小生成树.新边权设为原边权的两倍,再加上两端点的点权.完了 ...

  7. 认识setFactory

    平常设置或者获取一个View时,用的较多的是setContentView或LayoutInflater#inflate,setContentView内部也是通过调用LayoutInflater#inf ...

  8. Checking out pull requests locally

    https://help.github.com/en/articles/checking-out-pull-requests-locally https://github.com/betaflight ...

  9. sql server中实现mysql的find_in_set函数和group_concat类似功能的讲解

    charindex(','   +  ' test '+  ','   ,   ',' + test2+ ',')>0 灵活运用 SQL SERVER FOR XML PATH FOR XML ...

  10. 在WSL Ubuntu 下编译UPX详细步骤

    准备环境: 1. sudo apt-get update 2. sudo apt-get clang 3. apt-get install libstdc++-dev Reading package ...