Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >dotnet C# 应用程序进程创建太多线程将会抛出 OutOfMemoryException 异常

dotnet C# 应用程序进程创建太多线程将会抛出 OutOfMemoryException 异常

作者头像
林德熙
发布于 2021-09-23 07:01:51
发布于 2021-09-23 07:01:51
99000
代码可运行
举报
文章被收录于专栏:林德熙的博客林德熙的博客
运行总次数:0
代码可运行

本文记录一个 dotnet 的特性,在应用程序快速创建大量线程的时候,将会因为线程创建时没有足够的资源而创建失败,此时将会抛出 OutOfMemoryException 异常,但实际进程占用内存不多

如使用以下逗比代码进行线程的创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            while (true)
            {
                var thread = new Thread((_) =>
                {
                    Thread.Sleep(-1);
                });
                thread.Start();
            }

此时在运行时将会抛出 OutOfMemoryException 异常,在 x86 应用下,在我的设备上跑了大概 1000 个线程左右时将会炸掉,但是进程只占用了 60MB 左右的内存

c# - Why Thread.Start can throw OutOfMemoryException - Stack Overflow


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-C-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%BF%9B%E7%A8%8B%E5%88%9B%E5%BB%BA%E5%A4%AA%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%B0%86%E4%BC%9A%E6%8A%9B%E5%87%BA-OutOfMemoryException-%E5%BC%82%E5%B8%B8.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

无盈利,不卖课,做纯粹的技术博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,通过 EqualityComparer 静态类的相等方法来优化值类型相等判断性能
林德熙
2021/12/24
8220
dotnet C# 多线程集合的 Linq 获取值同时写入集合将会抛出异常
在集合变更,无论是使用 foreach 遍历还是使用 Linq 语句,即使是 FirstOrDefault 获取第一项,都会失败
林德熙
2021/12/24
5290
WPF 在窗口的 Deactivated 使用 Mouse 的 Capture 将会让进程失去交互
如果在某个窗口的 Deactivated 事件里面,使用 Mouse.Capture 方法,让这个窗口重新捕获鼠标,那么将会让进程的所有窗口都失去鼠标交互,点击无效,只有在切换到其他进程的窗口之后,才能让窗口继续交互
林德熙
2021/12/24
4280
dotnet 集成测试 SmartSql 存在静态量导致多个主机启动提示 Alias 已存在
在集成测试中,我采用单个进程开启多个主机,可以理解为一个用例开启一次主机。但是在我使用到 SmartSql 的功能时,我发现在一个主机关闭之后,再开启下一个主机,会因为使用了相同的别名而提示 SmartSql.Alias:[SmartSql] already exist 错误。本文告诉大家如何解决此问题
林德熙
2020/12/31
6450
dotnet C# 字典 Dictionary 和 Hashtable 的性能对比
如果没有特别的需求,请使用 Dictionary 而不是 Hashtable 原因是 Dictionary 的性能更好,本文将告诉大家 Stephen Toub 大佬的评测
林德熙
2021/12/24
7020
dotnet C# 字典 Dictionary 和 Hashtable 的性能对比
VisualStudio 配置多进程调试快捷键启动项目
在使用 VisualStudio 进行多进程调试的时候,只有第一个设置为启动项目的进程可以通过按下 F5 进行调试,而其他的进程是需要在对应项目右击选择调试,点击启动新实例,这样的调试效率实在很低。本文告诉大家如何设置快捷键用来启动选中项目调试
林德熙
2019/10/15
7910
VisualStudio 配置多进程调试快捷键启动项目
dotnet 读 WPF 源代码笔记 为什么默认的笔迹触摸点的压感是 0.5 的值
在 WPF 中,如 WPF 触摸到事件 博客内容,在 WPF 中将会通过 StylusPointCollection 传入原始的触摸数据,也就是 int[] rawPacketData 来创建触摸点
林德熙
2021/02/02
4170
记因为 NVIDIA 显驱错误而让 WPF 应用启动闪退问题
表现是 WPF 应用程序,在启动时,立刻闪退。在事件管理器看到的异常代码是 0xC0000005(Access Violation) 错误,通过捕获 DUMP 可以看到如下堆栈
林德熙
2022/03/16
1.3K0
记因为 NVIDIA 显驱错误而让 WPF 应用启动闪退问题
dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组
我在写一个有趣的 WPF 应用,我会不断收到从硬件发过来的数据,这些数据被使用 Byte[] 数组进行传输。我想要使用最快的方法转换为我的 int 数组或者转换为结构体数组,此时可以使用不安全代码的方式转换
林德熙
2021/02/01
1.6K0
dotnet C# 获取一个可用的端口的方法
在调用 Stop 方法的时候,将可以重复使用此端口,同时在系统分配里面,在一段时间内不会再次被使用,因此这个端口是安全的,可以在这里进行使用
林德熙
2021/12/24
7210
dotnet tool 判断博客文档链接是否可用的工具
本文来和大家安利一个好用的工具,通过这个工具可以找到自己博客文档里面,是否存在有链接已经失效了
林德熙
2020/11/19
3260
dotnet C# 获取当前设备可移动磁盘
在我的 WPF 应用里面,期望获取到 U 盘的所在盘进行一些有趣的逻辑。可以通过 DriveInfo 类的 GetDrives 获取当前所有的驱动器磁盘
林德熙
2021/12/01
9300
dotnet C# 获取当前设备可移动磁盘
dotnet C# 使用无捕获的委托可以获得编译器缓存减少对象创建
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,通过让委托无捕获来进行性能优化
林德熙
2021/12/24
5170
dotnet C# 使用无捕获的委托可以获得编译器缓存减少对象创建
dotnet C# 只创建对象不调用构造函数方法
有时我期望只是创建出对象,但是不要调用对象的构造方法,可以通过使用 FormatterServices 的 GetUninitializedObject 函数来实现只创建对象不调用构造函数方法
林德熙
2021/12/24
8790
dotnet C# 给结构体字段赋值非线程安全
在 dotnet 运行时中,给引用对象进行赋值替换的时候,是线程安全的。给结构体对象赋值,如果此结构体是某个类的成员字段,那么此赋值不一定是线程安全的。是否线程安全,取决于结构体的大小,取决于此结构体能否在一次原子赋值内完成
林德熙
2021/09/10
9660
dotnet C# 给结构体字段赋值非线程安全
dotnet C# 在 finally 抛异常会发生什么
如果我在一个方法的 finally 里面抛出异常,而在 try 里面也抛出,那在上层拿到的是什么
林德熙
2021/12/24
3330
dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量
如果使用某个变量去获取某个类型的对象创建,但是在这个类型的构造函数调用时抛出异常,请问此变量是否可以拿到对应的对象
林德熙
2021/12/24
9650
dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 后台线程创建 WriteableBitmap 锁住主线程
在 WPF 中,如果在没有开启 Dispatcher 的后台线程里面创建 WriteableBitmap 对象,在 WriteableBitmap 构造函数传入在主线程创建的 BitmapSource 也许就会锁住主线程。本文将通过 WPF 框架源代码告诉大家为什么会锁住主线程
林德熙
2021/04/19
5940
ASP.NET Core 引用其他程序集项目里面的 Controller 控制器
我将控制器 Controller 按照不同的业务,分为多个不同的项目,我需要在路由里面调度到多个不同项目的控制器
林德熙
2021/04/25
1.3K0
ASP.NET Core 引用其他程序集项目里面的 Controller 控制器
dotnet C# 调用委托的 GetInvocationList 的对象分配
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,在热路径下,也就是频繁调用的模块,如果调用了委托的 GetInvocationList 方法,那么将视委托的大小,每次创建不同大小的新数组对象,而在频繁调用的模块,将会创建大量的对象
林德熙
2021/12/24
6680
推荐阅读
相关推荐
dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验