ConcurrentBag 是内存泄漏的原因吗? [复制]

2023-12-06

可能的重复:
ConcurrentBag 中可能存在内存泄漏吗?

我的应用程序中存在严重的内存泄漏。我在其中一种方法中添加到本地并发包集合中的所有数据从未被收集。

这个简单的代码演示了我如何使用它:

void Main()
{
    var l = new List<int>(){1,2,3,4};
    Func(l);
    l.Clear();
    l=null;
}

void Func(List<int> list)
{
    var bag = new ConcurrentBag<int>();
    Parallel.ForEach(list, k=> bag.Add(++k));

    list.Clear();

    foreach(int i in bag) //I know, I doing it wrong.
    {
        list.Add(i);
    }
}

我期望的是:包将被创建并在方法“Func”处处理。

我看到的是:bag 永远不会释放,保存在 Parallel.ForEach 中创建的所有线程,保存我添加到其中的所有数据。 =(

好的,当我将其添加到列表中时,我可以使用“TryTake”从包中删除该项目。但空袋子仍然留在记忆中。

现在我通过使用 List 而不是 ConcurrentBag 来解决问题。但自从我在记忆分析器中看到这一点后,我就睡不好觉了。对不起我的英语=)

UPDATE

我改变我的方法“Func”:

void Func(List<int> list)
{
    var bag = new ConcurrentBag<int>();
    Parallel.ForEach(list, k=> bag.Add(++k));

    list.Clear();

    int i;
    while(bag.TryTake(out i))
    {
        list.Add(i);
    }

    bag = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

然后我在VS中创建项目,编译并运行我的程序。该实例图是由“.Net Memory Profiler 4.0”根据内存快照创建的,是我在程序完成所有工作后 10 分钟内收集的:

http://xmages.net/storage/10/1/0/f/d/upload/4c67f305.jpg(抱歉,只是不能发图片)


这是因为并发包将项目添加到线程的本地存储中。线程的本地存储对 bag 的引用是强引用,因此只要 bag 中还有 1 个项目,就可以确保至少有 1 个线程引用该 Bag 并且不会被收集。消耗掉袋子中的所有物品或使用不同的容器。

请参见:ConcurrentBag 中可能存在内存泄漏吗?

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

ConcurrentBag 是内存泄漏的原因吗? [复制] 的相关文章

  • VS Code:自定义关键字的注入语法范围在 C++ 中被覆盖

    我想制作一个小型 VS Code 扩展 为 C C 代码中的少数自定义关键字添加语法突出显示 我正在尝试通过注入语法来做到这一点source c and source cpp语言范围 遵循VS Code 语法高亮指南 https code
  • 将 LUIS 与 FormFlow 集成

    我创建了一个机器人 里面有一个 FormFlow 现在 如果您输入 我想启动产品 LUIS 将告诉它必须转到哪个对话框 internal static IDialog
  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 创建动态对象

    如何动态创建对象 string columnNames EmpName EmpID PhoneNo List
  • 未定义的参考错误 - rand

    我正在创建一个命令行 C 测试应用程序 可执行 以便在我的 root Android 设备上运行 该可执行文件使用多个预构建的 C 库 其中之一使用 rand 在链接状态期间我收到错误 rand 的未定义引用 为了检查路径是否设置正确 我尝
  • C# 中具有字符串键类型的不区分大小写字典

    如果我有一个Dictionary
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • unique_ptr需要存储删除器怎么可能没有开销呢?

    先看看C Primer讲了什么unique ptr and shared ptr 16 1 6 美元 效率和灵活性 我们可以确定的是shared ptr不将删除者视为直接成员 因为删除器的类型直到运行时才知道 因为删除器的类型是a类型的一部
  • 将二维整数作为 Readonly/const 存储在单独的类中,同时保持非公开

    这是我在使用这个地方作为我的 去处 以获取关于什么有效 无效 为什么等的一般意见之后的第一个问题 那么让我们试试这个 由于我的经验有限 我一直在尝试寻找更好的方法来创建固定数据字段 我可以在整个程序中引用这些字段 例如我反复显示的最终用户可
  • Err_Response_Headers_Multiple_Content_Disposition

    我需要导出 2csv单击一个按钮即可打开文件 下面是我生成2的代码csv files using System Data using System Data SqlClient using System Text using System
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • 从多页 tiff 中提取帧 - C#

    有一个多页 tiff 我想从此 Tiff 文件中提取第 n 页 帧 n 并保存它 如果我的多页 tiff 有 3 帧 在我提取一页 帧后 我想留下 1 张图像有 2 页 帧 并且 1 张图像只有 1 页 帧 下面是一些代码 用于将多帧 ti
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • 使用 C++20 概念避免 std::function

    过去 当我想要回调作为函数参数时 我通常决定使用std function 在极少数情况下 我绝对从不使用捕获 我使用了typedef改为函数声明 因此 通常我的带有回调参数的声明看起来像这样 struct Socket void on re
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是一对一的关系不好的策略

    用户始终拥有一个钱包 一个钱包始终属于一位用户 由于我想分离与钱夹相关的属性 我创建了 Wallet 对象并能够跟踪钱交易 我创建了 public Wallet Entity

随机推荐

  • 如何通过钥匙获取锁

    在不锁定整个集合的情况下防止并发更新键值集中一条记录的最佳方法是什么 从语义上讲 我正在寻找某种按键锁定 理想情况下是 Java 实现 但不一定 interface LockByKey void lock String key acquir
  • 如何安装com.mysql.jdbc.Driver“找不到类名的驱动程序:com.mysql.jdbc.Driver”?

    我正在设置 Atlassian Confluence 在选择数据库时 我选择 使用外部 Mysql DB 我看过一些教程 但对我来说 它并没有按照应有的方式工作 我使用 ubuntu 12 04 服务器并安装了 mysql 现在我尝试与外部
  • awk FieldWITHS 是如何工作的

    几天前我开始学习 awk 编程 有效的 awk 脚本 在第 102 页 作者解释了字段宽度 但我不明白它是如何工作的 请有人向我解释一下 fieldwidths 是如何工作的 场宽以空格分隔的字段宽度列表 设置后 gawk 将输入解析为固定
  • Vuejs 打开/切换单个项目

    我使用单个文件组件 并在其中之一中有一个列表 这个列表应该像手风琴一样工作 但据我在 Vuejs 文档中找到的 让每个项目单独打开并不那么容易 数据 问题和答案 是从 ajax 调用中检索的 我使用 jQuery 来实现这一点 但想知道如何
  • 升级到 Ninject 3.0.0-rc3 后连接字符串异常

    我最近将我的网站项目更新为 Ninject 3 0 0 rc3 之后我收到错误消息 提供的连接无效 因为它包含的映射或元数据信息不足 当我使用 2 2 0 0 版本时 所有这些都有效 知道什么会导致出现此异常以及如何解决它 我使用的是 EF
  • eclipse:覆盖config.ini中的user.name

    我有一个多用户 eclipse 3 4 安装 带有共享主配置区域 用户需要覆盖user name使用他们的全名和通常的方法 添加 Duser name 到 eclipse ini 是不合适的 因为覆盖必须是针对每个用户的 我尝试在 conf
  • 闪亮 - FILL 值未在闪亮服务器中正确传递给 ggplot - 未找到错误对象“输入”

    我正在尝试开发一个闪亮的应用程序 它将在浏览器上安装基于地图的热图 并允许您更改热图上显示的变量 该地图是具有 GIS 形状文件的地理区域 然后所选变量将作为热图显示在地图上 不幸的是我有一个问题 变量没有被传递给ggplot 正确 但我的
  • 从 Java 中的另一个类访问变量的实例

    是否可以从 Java 中的另一个类访问一个类中变量的实例 假设您在 A 类中拥有以下内容 private BlockingQueue
  • 正则表达式检查两个第一个单词是否相同

    例如 s1 Test Test the rest of string s2 Test the rest of string 我想积极匹配 s1但不是 s2 因为第一个词 s1与第二个相同 单词 Test 例如 正则表达式应该适用于任何单词
  • 如何在JS中下载浏览器(包括Firefox)中的10个以上文件

    我尝试使用以下代码一次下载多个文件 var urls for var i 0 i lt urls length i var tempLink document createElement a tempLink setAttribute hr
  • 尝试编写一个通用函数来将 JSON 解析为可编码结构

    我目前正在像这样解析 JSON struct ExampleStruct Codable init implementation if let jsonData jsonString data using utf8 do let decod
  • UITableView iPhone SDK 中的延迟加载图像

    我需要在表视图中实现图像的延迟加载概念 以便首先向用户提供文本数据 然后向用户提供图像 我怎样才能在我的应用程序中实现这个 需要帮助 请 提前致谢 Shibin 我为我的项目创建的内容如下 通过 UITableViewCell Async
  • 为什么名为“del”、“return”等的对象属性是语法错误?

    我知道人们不应该能够替换 del return 等 关键字的行为 但我不明白为什么不可能这样做 myobj del mystr 解析器会将其与什么混淆 有办法允许吗 当然 我可以使用不同的名称 但我想在 AWS 工具 s3cmd 周围有一个
  • 嵌套模型中 mongoose-auto-increment 插件的问题

    我正在尝试增加procedureid doctorId每当 api 调用被触发时 我正在使用以下语法 但是 它给出了一个错误Treatment procedureid 1 dup key当我第二次通过浏览器调用api时 我可以看到 proc
  • 在视图中渲染数据之前在控制器中过滤数据

    你好 我是very new到 MVC5 Razor 和 EF 我已经寻找了两天 但仍然无法找到解决我的问题的方法 我想要做的是查看用户输入年份 季度和部门的视图 提交时 我希望另一个视图的控制器能够查看这些参数并在渲染视图之前过滤数据 目前
  • 计算列中零的百分比

    我在 DF df catch rate 中有一列捕获率数据 其中包含十进制值和零的组合 我想计算整列中零行的百分比 以表明它们对数据的贡献 mean df catch rate 会成功的 您可以添加参数na rm TRUE如果有NAs
  • AJAX 和 Coldfusion:执行数据库更新并反映更改而无需重新加载

    我在想象这里需要的解决方案时遇到问题 我正在处理的网站上有一个选择菜单 客户端希望能够选择一个名为 创建新源 的选项 然后会弹出一个 JS 窗口 其中包含一个空白字段 供用户选择输入新的原点 提交此表单后 数据库将被更新 选择菜单现在将包含
  • 使用 data.table 在单一条件下替换多列

    我想将默认值 255 更改为 NA dt lt data table x c 1 5 255 0 NA y c 1 7 255 0 0 z c 4 2 7 8 255 coords lt c x y 其中给出了以下代码 x y z 1 1
  • 字母数字的正则表达式,但至少一个字母

    在我的 ASP NET 页面中 我有一个输入框 必须对其进行以下验证 必须是字母数字 至少包含one字母 即不能是全部 数字 d a zA Z a zA Z0 9 基本上这意味着 零个或多个 ASCII 数字 一个 ASCII 字母字符 零
  • ConcurrentBag 是内存泄漏的原因吗? [复制]

    这个问题在这里已经有答案了 可能的重复 ConcurrentBag 中可能存在内存泄漏吗 我的应用程序中存在严重的内存泄漏 我在其中一种方法中添加到本地并发包集合中的所有数据从未被收集 这个简单的代码演示了我如何使用它 void Main