ConcurrentBag 实现中是否存在内存泄漏? [复制]

2023-12-27

可能的重复:
ConcurrentBag 中可能存在内存泄漏吗? https://stackoverflow.com/questions/5353164/possible-memoryleak-in-concurrentbag

Edit1:

实际的问题是。您能否确认这一点,或者我的样本是否错误并且我遗漏了一些明显的东西?

我认为 ConcurrentBag 只是无序列表的替代品。但是我错了。 ConcurrentBag 确实将自身作为 ThreadLocal 添加到创建线程中,这基本上会导致内存泄漏。

   class Program
    {
        static void Main(string[] args)
        {
            var start = GC.GetTotalMemory(true);
            new Program().Start(args);
            Console.WriteLine("Diff: {0:N0} bytes", GC.GetTotalMemory(true) - start);
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            Thread.Sleep(5000);
        }

        private void Start(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            { 
                var bag = new ConcurrentBag<byte>();
                bag.Add(1);
                byte by;
                while (bag.TryTake(out by)) ;
            }
        }

我可以将 Diff 设为 250 KB 或 100 GB,具体取决于我添加到包中的数据量。数据和包都会消失。

当我用 Windbg 闯入这个问题时,我做了一个 !DumpHeap 类型并发

....

000007ff00046858        1           24 System.Threading.ThreadLocal`1+GenericHolder`3[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib],[System.Threading.ThreadLocal`1+C0[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]], mscorlib]]
000007feed812648        2           64 System.Collections.Concurrent.ConcurrentStack`1[[System.Int32, mscorlib]]
000007feece41528        1          112 System.Collections.Concurrent.CDSCollectionETWBCLProvider
000007ff000469e0     1000        32000 System.Threading.ThreadLocal`1+Boxed[[System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]], System]]
000007feed815900     1000        32000 System.Collections.Concurrent.ConcurrentStack`1+Node[[System.Int32, mscorlib]]
000007ff00045530     1000        72000 System.Collections.Concurrent.ConcurrentBag`1+ThreadLocalList[[System.Byte, mscorlib]]

当我创建一个空的 ConcurrentBag 来让一些工作线程向其中添加数据时,只要创建线程仍然存在,ConcurrentBag 的数据就会在那里。

这样我就得到了几 GB 的内存泄漏。我通过使用列表和锁来“修复”这个问题。 ConcurrentBag 可能很快,但作为具有相同对象生命周期的 List 的简单替换,它毫无用处。

如果我在主线程上创建 ConcurrentBag,只要线程处于活动状态,我就会保留它。这不是我所期望的,它可能会导致严重的痛苦。


你说得对,ConcurrentBag 创建了一个 ThreadLocal 副本,事实上它们针对同一线程读取数据并将数据写入包的场景进行了优化:“...ConcurrentBag 是一个线程安全的包实现,针对相同线程读取数据并将数据写入包的场景进行了优化”线程将生成和消耗存储在包中的数据。”

另一方面,我在这里没有看到奇怪的行为;线程存活并且并发包存活。当线程完成时,GC 将完成它的工作。

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

ConcurrentBag 实现中是否存在内存泄漏? [复制] 的相关文章

  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 如何使用 Roslyn 通过扩展方法、静态类中的方法以及带有 ref/out 参数的方法来访问调用

    我正在致力于创建一个开源项目 用于创建 NET UML 序列图 该项目利用名为 js sequence diagrams 的 javascript 库 我不确定 Roslyn 是适合这项工作的工具 但我想我应该尝试一下 所以我整理了一些概念
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • EnumDisplayDevices 与 WMI Win32_DesktopMonitor,如何检测活动监视器?

    对于我当前的 C 项目 我需要为在大量计算机上连接并处于活动状态的每个监视器检测一个唯一的字符串 研究指出了两种选择 使用 WMI 并查询 Win32 DesktopMonitor 以获取所有活动监视器 使用 PNPDeviceID 来唯一
  • 在 Windows CE 6.0 与 Windows Mobile 6.1 下进行开发的权衡是什么

    我有一个 Windows NET 应用程序 我计划将其 移植 并定制为移动设备 该应用程序由一个独立的 NET 程序组成 该程序与条形码扫描仪配合使用 具有简单的 UI 并将扫描结果记录到文件中 还有一个 Windows 服务 可以使用 W
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 如何从键而不是值推断类型参数?

    我有一个表示有向图结构的类 它是具有一个类型参数的通用类K extends string对于节点名称 图表是通过传递一个对象来构造的 例如 a b b 在这个最小的例子中代表两个节点a and b 有一条边a b class Digraph
  • 为什么 ScriptEngine 不再有 Execute 方法?

    目前我已经开始更认真地与罗斯林合作 我发现本文 http visualstudiomagazine com articles 2011 11 16 the roslyn scripting api aspx关于使用ScriptEngine在
  • 通过四维数据寻路

    问题是找到飞机穿过四维风 不同高度的风 并且随着飞行而变化的风 预测风模型 的最佳路线 我使用了传统的 A 搜索算法 并对其进行了修改 使其能够在 3 维和风向量中工作 它在很多情况下都有效 但速度非常慢 我正在处理大量数据节点 并且不适用
  • PATH_MAX和NAME_MAX之间是什么关系,如何获取?

    In limits h 并且在 POSIX 联机帮助页的各个地方都引用了PATH MAX and NAME MAX 这些相互之间有何关系 他们的官方文档在哪里 如何在 C Python 和 GNU shell 环境的运行时和 相关 编译时获
  • 如何将身份验证、角色和安全性融入 DDD 中?

    如何在 C 域驱动设计项目中实现角色和安全性 关于它是否应该由调用应用程序 ASP NET MVC 实现还是在域模型本身 模型实体和服务 中实现 我们存在一些激烈的争论 有些人认为它应该在网站本身中 因为那里已经存在身份验证 但这意味着每次
  • 将屏幕截图上传到 iTunes Connect 时出现奇怪的错误

    我正在尝试将新的屏幕截图上传到 iTunes Connect 上的游戏页面 但当我这样做时 我收到了一个与现实和 或常识无关的错误 基本上 我上传了一堆具有正确分辨率 尺寸等的 iPhone 屏幕截图 然后收到一条错误消息 说我没有这样做
  • 如何在 igraph R 中的图组件之间添加边

    我有一个图表包含4 components 现在 我想在其中添加一个优势all components基于size of the membership 例如 下图包含4 components 首先 我将连接all components with
  • AngularJS - 原始/肮脏和触摸/未触摸之间的区别

    AngularJS 开发人员指南 表单 https docs angularjs org guide forms列出了许多有关表单和字段的样式和指令 对于每一个 都有一个 CSS 类 ng valid ng invalid ng prist
  • 创建 DPI 感知应用程序

    我有一个 C 表单应用程序 当我更改显示器的 DPI 时 所有控件都会移动 我用了代码this AutoScaleMode AutoScaleMode Dpi 但这并没有回避问题 有人有想法吗 编辑 从 NET 4 7 开始 Windows
  • 为什么需要设置 DefaultForbidScheme

    在 WebAPI net 核心项目中 我创建了一个验证 api 密钥的中间件类 通过验证它 它会检索该密钥在调用方法中拥有的权限 用户或管理员 我通过一个开关来设置原理 就像这样 GenericIdentity identity new G
  • 在 Haskell 中循环时

    如何在 Haskell 中编写以下伪代码 x 0 for i from 0 to 100 j 0 while f i j gt 0 x f i j j 1 f一些不重要的功能 我想出了这样的事情 a x i lt 0 100 let s t
  • 如何调整直接从 R 脚本渲染的 pdf 中的图形大小?

    我从一些地方读到 直接从 R 脚本渲染的 pdf 的图形大小可以设置为knitr opts chunk 我想从包含多个图形的 R 脚本制作一个 pdf 文件 并尝试使用以下命令调整图形大小opts chunk 然而 这并没有奏效 下面是一个
  • 委托在 Objective-C 中如何工作?

    有谁知道我在哪里可以找到有关应用程序委托的内容和工作方式的良好解释 教程objective C 我手头的两本书没有详述delegates足够了 并且没有很好地解释它们 让我真正理解它们的力量和功能 如有疑问 请检查docs https de
  • 并发和协调运行时 (CCR) 学习资源

    我最近正在学习它的内部和外部并发和协调运行时 CCR http msdn microsoft com en us library bb905450 aspx为这项相对较新的技术寻找良好的学习资源非常困难 谷歌快速搜索后 Creedence
  • 如何在cmake中打印所有编译选项

    我的项目使用 cmake 一些编译选项是通过配置的set set CMAKE CXX FLAGS DEBUG g set CMAKE CXX FLAGS DEBUG CMAKE CXX FLAGS DEBUG O0 set CMAKE CX
  • UIGestureRecognizer 用于 UIView 的一部分

    我在 iOS 应用程序中使用 UIGestureRecognizer 但遇到了一些问题 我只希望手势在视图的某个区域起作用 因此我使用特定框架创建了一个新的 UIView 并将其添加到根视图中 手势工作正常 但现在唯一的问题是我无法单击新视
  • 如何使用 RSACryptoServiceProvider 解密加密文本?

    我已使用 RSACryptoServiceProvider 加密了文本 我导出了公钥和私钥 显然我只是想在解码器应用程序中公开公钥 所以我编写了如下代码 private const string PublicKey
  • 表单“onsubmit”没有被调用

    这是我的表格的一部分
  • 检查目录是否是符号链接?

    In os有一个函数os path islink PATH 它检查是否PATH是符号链接 但是如果当 PATH 是某个目录的符号链接时失败 相反 python 认为它是目录 os path isdir PATH 那么如何检查目录是否是链接呢
  • ConcurrentBag 实现中是否存在内存泄漏? [复制]

    这个问题在这里已经有答案了 可能的重复 ConcurrentBag 中可能存在内存泄漏吗 https stackoverflow com questions 5353164 possible memoryleak in concurrent