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 是内存泄漏的原因吗? [复制] 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 如何通过钥匙获取锁

    在不锁定整个集合的情况下防止并发更新键值集中一条记录的最佳方法是什么 从语义上讲 我正在寻找某种按键锁定 理想情况下是 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