ThreadLocal 和内存泄漏

2023-11-26

在多个帖子中都提到:不当使用ThreadLocal导致内存泄漏。我正在努力理解内存泄漏是如何发生的ThreadLocal.

我想到的唯一场景如下:

Web 服务器维护一个线程池(例如,用于 servlet)。如果变量在这些线程中,则可能会造成内存泄漏ThreadLocal不会被删除,因为线程不会消亡。

这个场景没有提到“Perm Space”内存泄漏。这是内存泄漏的唯一(主要)用例吗?


永久代耗尽结合ThreadLocal往往是由类加载器泄漏.

一个例子:
想象一个应用程序服务器有一个池工作线程.
它们将保持活动状态,直到应用程序服务器终止。
部署的 Web 应用程序使用static ThreadLocal在它的一个类中为了存储一些线程本地数据,另一个类的实例(我们称它为SomeClass)的网络应用程序。这是在工作线程内完成的(例如,此操作源自HTTP请求).

重要的:
根据定义,对一个的引用ThreadLocal value一直保留到“拥有”线程死亡或者 ThreadLocal 本身不再可达。

如果网络应用程序无法清除引用 to the ThreadLocal 关机时,会发生不好的事情:
因为工作线程通常永远不会消亡,并且对ThreadLocal是静态的,则ThreadLocal value 仍然参考的实例SomeClass,一个 Web 应用程序的类 -即使网络应用程序已停止!

因此,Web 应用程序的类加载器无法被垃圾回收, 意思就是所有课程Web 应用程序(以及所有静态数据)保持加载状态(这会影响 PermGen 内存池以及堆)。
Web 应用程序的每次重新部署迭代都会增加 permgen(和堆)的使用量。

=> 这是永久元泄漏

这种泄漏的一个常见例子是this bug在 log4j 中(同时修复)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThreadLocal 和内存泄漏 的相关文章

随机推荐

  • 相当于 R 中字符串的 cumsum [重复]

    这个问题在这里已经有答案了 我正在寻找一种方法来执行相当于 R 中字符串 字符格式文本而不是数字的累积和的方法 不同的文本字段应连接起来 例如 在数据框 df 中 A 列包含输入 B 列包含所需结果 A B 1 banana banana
  • 如何使用 Git 获取两个日期之间发生的所有提交之间的差异?

    或者只是两个日期之间发生的所有提交 在 SVN 中 你可以做类似的事情 svn diff r date date 去做吧 我似乎找不到与此等效的 Git 具体来说 我正在考虑编写一个脚本来发送每日电子邮件 其中包含当天提交的所有代码以及由谁
  • 使用 Python 检查远程 SSH 服务器上的文件是否存在

    我有两台服务器 A 和 B 我想将图像文件从服务器 A 发送到另一台服务器 B 但是在服务器 A 发送文件之前 我想检查服务器中是否存在类似的文件B 我尝试使用 os path exists 但它不起作用 print os path exi
  • 按位记忆移动

    实现按位的最佳方法是什么memmove 该方法应该采用额外的目标和源位偏移量 并且计数也应该以位为单位 我看到ARM提供了一个非标准的 membitmove 这正是我所需要的 但我找不到它的来源 Bind 的位集包括isc bitstrin
  • delphi 保存和加载动态数组

    请有人帮助我从流中保存和加载其动态数组 const iGlobHolderCount 100 type TFiLeSpec record iSize Integer end TFileSpecLst array of TFiLeSpec T
  • 如何选择已使用 OpenFileDialog 打开的文件

    我正在尝试选择已在 Quickbook 软件中打开的文件 code OpenFileDialog ofdBrowseVInv new OpenFileDialog ofdBrowseVInv Title Locate QuickBook C
  • 无法解决:com.android.support:appcompat-v7:15.+

    我找到了这个问题的两个解决方案 但都不起作用 所以我决定问问你 我正在使用 Debian 8 Jessie 和 Android Studio 1 4 我刚刚创建了新项目 当我尝试启动它时出现错误 无法解析 com android suppo
  • 删除指针是什么意思?

    删除指针与释放指针 分配内存 相同吗 删除指针 或者删除它指向的内容 意味着 delete p delete p for arrays p在该语句之前分配 例如 p new type 它还可能指使用其他动态内存管理方式 例如free fre
  • 错误代码:1422。存储函数或触发器中不允许显式或隐式提交

    我到处都看到 MySQL 存储过程可以做事务 然而当我声明我的存储函数时 create function test a int returns int MODIFIES SQL DATA BEGIN START TRANSACTION up
  • 如何打开备用网络浏览器(Mozilla 或 Firefox)并显示特定 URL?

    我知道有内置的 Internet Explorer 但我正在寻找的是使用指定的 URL 打开 Firefox Mozilla 窗口 运行应用程序 任何人都可以告诉我如何在 C nET 中做到这一点 你可以这样做 System Diagnos
  • 如何解决“等待调试器”消息?

    我使用 SDK 2 2 将 HTC Comet 连接到 Eclipse 我进行了调试构建 应用程序未运行 尽管它确实安装在设备上 在设备上 我在 Comet 屏幕上看到此消息框 等待调试器应用程序 HunyDew 进程 com airvin
  • 非泛型 IEnumerable 和泛型 IEnumerable 之间有什么区别?

    很抱歉提出这样一个模糊的问题 但我一直在寻找一天中最好的部分 我读了一篇又一篇文章 这里还有很多问题 但就是找不到一个容易理解的答案 我 认为我 知道 IEnumerable 的用途 但我只是无法理解它用泛型类型参数定义时的含义 例如 IE
  • 如何将Lambda表达式转换为Sql?

    我正在开发一个小型框架来访问数据库 我想添加一个使用 lambda 表达式进行查询的功能 我该怎么做呢 public class TestModel public int Id get set public string Name get
  • 为什么 Wrap_Content 多次触发 BindView

    我正在开发一个带有 listView 的 Android 应用程序 并且正在对其进行优化 它在一个活动中使用自定义游标适配器 我注意到 bindview 为列表的每一行触发两次 在研究 BindView 和 NewView 方法时 我在一篇
  • 使用gerrit时,如何删除remotes标签?

    大家 我正在使用 gerrit 但遇到了一些问题 我创建了一个 v1 0 的标签 我现在想从本地和远程删除它 已完成操作 git tag d v1 0 git push origin refs tags v1 0 然后 我遇到了一个错误 r
  • 这个习语是Pythonic吗? (someBool 和“正确结果”或“错误结果”)

    我刚刚在一些开源Python中看到了这个习语 我被饮料噎住了 而不是 if isUp return Up else return Down or even return Up if isUp else Down 代码如下 return is
  • 在 Clojure 中解析 XML

    我是 clojure 新手 所以请耐心等待 我有一个如下所示的 XML
  • 如何在输入密码时将其转换为星号? [复制]

    这个问题在这里已经有答案了 Python 有没有一种方法可以将用户输入的字符转换为星号 就像在许多网站上看到的那样 例如 如果电子邮件用户被要求登录其帐户 则在输入密码时 密码不会显示为字符 而是显示为 每次单独划水后 没有任何时间滞后 如
  • Theano Dimshuffle 相当于 Google 的 TensorFlow 吗?

    我已经看到转置和重塑一起可以提供帮助 但我不知道如何使用 例如 暗淡洗牌 0 x 使用转置和重塑相当于什么 或者 还有更好的方法 谢谢 实现 Theano 的相关操作有三个dimshuffle在 TensorFlow 中 tf transp
  • ThreadLocal 和内存泄漏

    在多个帖子中都提到 不当使用ThreadLocal导致内存泄漏 我正在努力理解内存泄漏是如何发生的ThreadLocal 我想到的唯一场景如下 Web 服务器维护一个线程池 例如 用于 servlet 如果变量在这些线程中 则可能会造成内存