实现 OutOfMemory​

通过代码实现 OutOfMemory

Intro

来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 —— OutofMemory

OutOfMemory

OutOfMemory 顾名思义就是内存不足,在 .NET 中当内存不足的时候就会抛出 OutOfMemoryException 的异常。

想要触发 OutOfMemoryException 就要满足内存不足的条件,在 .NET Framework 中可能就只能一直分配内存直到内存不足,再没有足够的内存可以分配了,在 .NET Core 3.x 版本以后,微软引入了一些 GC 的配置,我们可以通过这些配置来指定最大的 GC 内存,这样我们就可以实现触发 OutOfMemoryException 而不影响其他应用程序正常运行的目标了。在 .NET 5 中我们又可以更进一步更精细的控制 GC 使用的内存了,在 .NET 5 中我们可以针对每个堆(SOH/LOH/POH)来设置内存限制。

GC 堆内存限制配置

我们测试的示例使用限制 GC 堆大小 (Heap Limit) 的方式来限制应用程序的内存占用以免影响到别的应用程序正常运行(该配置只针对 64 位电脑有效,现在的电脑应该大多都是64位吧)。

配置的方式有两种,一种是通过环境变量来配置,一种是通过 runtime.config.json 来配置

通过环境变量配置 COMPlus_GCHeapHardLimit 为要配置的内存大小,需要注意的是通过环境变量配置的时候指定的值需要是十六进制的值,通过 runtimeconfig.json 配置的时候是直接用十进制的数值

因为我们只是想简单的测试一下,不能影响别的应用程序,而且不能在代码里配置当前进程的环境变量,因为进程启动的时候 GC 的配置就已经加载好了,在代码里配置当前进程的环境变量来改变 GC 配置是不会生效的,所以我们选择配置 runtimeconfig.json 来测试,在项目的 bin 目录下可以找到 runtimeconfig.json 文件,我们修改这一个文件即可(使用 runtimeconfig.json 的时候需要注意先生成一下,然后再更新 runtimeconfig.json 文件)

测试配置如下,配置的 GC 堆的最大值是 1M(配置的不能太小,太小的话 CoreCLR 可能都会启动失败从而导致程序无法正常运行):

{"runtimeOptions": {"tfm": "netcoreapp3.1","framework": {"name": "Microsoft.NETCore.App","version": "3.1.0"},"configProperties": {"System.GC.HeapHardLimit": 1048576}}
}

测试代码

测试代码如下:

Console.ReadLine();
var bytes = GC.GetTotalAllocatedBytes();
Console.WriteLine($"AllocatedBytes: { bytes } bytes");
var list = new List<byte[]>();
try
{while (true){list.Add(new byte[85000]);}
}
catch (OutOfMemoryException)
{Console.WriteLine(nameof(OutOfMemoryException));Console.WriteLine(list.Count);bytes = GC.GetTotalAllocatedBytes();Console.WriteLine($"AllocatedBytes: { bytes } bytes");
}
Console.ReadLine();

测试输出如下:

上面的测试代码使用的 byte 数组的长度是 85000 的原因是,当要分配的对象大于等于 85k(85000)时会直接分配到大对象堆中,正好可以测试一下。

我们使用微软的 dotnet dump 诊断工具来测试一下

第一次 dump 是在 list 对象创建之前进行的,第二次 dump 是发生 OutOfMemory 之后的

从上面的 dump 结果可以看的出来,byte 数组的对象确实是分配在大对象堆(LOH)上的,几乎所有的内存分配都在大对象堆中,有一些小对象从0 代升到了 1代。

More

上面的测试代码使用的 byte 数组的长度是 85000 ,你测试的时候也可以使用更大的值,或者直接使用 int.MaxValue

在前面的 StackOverflow 文章中,有网友评论说,他们之前遇到的一个 StackOverflow 示例常常伴随着 OutOfMemory ,递归和这种方式有点类似,都是要一直创建新的对象,分配新的内存。

除此之外,还有哪些更简单的方式吗?欢迎补充

References

  • https://docs.microsoft.com/en-us/dotnet/core/run-time-config/garbage-collector#heap-limit

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/StupidSamples/FullMemorySample.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件构造学习笔记-实验3

本次实验要求从五项要求&#xff08;航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理&#xff09;里完成三项要求&#xff0c;并且尽量实现复用。 面向可复用性和可维护性的设计&#xff1a;PlanningEntry 1.首先设计一个类CommonPlanningEntry来实现…

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一&#xff1a;背景 1. 讲故事前段时间写了几篇 C# 漫文&#xff0c;评论留言中有很多朋友多次提到 Span&#xff0c;周末抽空看了下&#xff0c;确实是一个非常????????的新结构&#xff0c;让我想到了当年的WCF&#xff0c;它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言&#xff0c;到底有多重要&#xff0c;这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员&#xff0c;在进阶高级工程师或架构师的路上&#xff0c;栽在了“算法”上&#xff0c;说实话&#xff0c;我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中&#xff0c;而不是通过if-else进行处理&#xff0c;提高了代码整体的简洁性。同时&#xff0c;异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息&#xff0c;对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合&#xff0c;里面有数字1-10&#xff0c;现在想实现从这10个数字中取出偶数数字&#xff0c;然后将得到的偶数乘以10&#xff0c;最后输出前三个。代码如下&#xff1a;代码非常的简单&#xff0c;最后会得到20、40、60这三个数字&#xff0c;但结果并不是我们今…

软件构造学习笔记-实验4

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程&#xff0c;都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时&#xff0c;选择需要操作的项目/包/类点击右键&#xff0c;就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET&#xff1f;ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能&#xff0c;可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测&#xff0c;而不需要进行显式编程。ML.NET 的核心是机器学习模型…

软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改&#xff0c;甚至加入一条print语句就能改变时间分片&#xff0c;从而导致错误消失。重点介绍了“锁”的机制&#xff0c;在使用时避免对整个方法进行lock&#xff0c;而是对可能发生线程不…

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU&#xff0c;相对来说也比前面三个简单一些&#xff0c;没有那么多的知识点。今天来尝试写一段代码&#xff0c;把 CPU 打满&#xff0c;让所有处理器的 CPU 使用率达到 100%&#xff0c;Lets do it.如…

吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日&#xff08;截止日期&#xff09;之前完成DeepLearning的所有课程学习。每个课程对应一篇博客&#xff0c;根据学习进度随时更新。 参考课程文章目录&#xff08;一&#xff09;深度学习概论结构化数据和非结构化数据提高效果的方法&#xff08;二&#xff09;神经…

吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化

文章目录第一周&#xff1a;深度学习的实用层面训练、开发、测试集偏差、方差机器学习基本步骤L2正则化Dropout&#xff08;随机失活&#xff09;正则化其它正则化方法正则化输入神经网络的权重初始化梯度检验第二周&#xff1a;优化算法Mini-Batch梯度下降法指数加权平均指数加…

面向监狱编程:一伙人植入木马程序至 559 万部手机,盈利 33 万!

2018 年下半年以来&#xff0c;孙某&#xff08;上海宏路数据技术股份有限公司副总经理&#xff09;与苏某&#xff08;北京亿量科技有限公司法定代表人&#xff09;商议合作开展锁屏拉起广告业务&#xff08;通过在用户手机上植入带有木马程序的 SDK&#xff0c;可控制手机在锁…

吴恩达DeepLearningCourse3-结构化机器学习项目

文章目录第一周&#xff1a;机器学习策略1正交化单一数字评估指标满足和优化指标训练/开发/测试集机器学习和人的表现第二周&#xff1a;机器学习策略2进行误差分析修正标注错误的数据使用来自不同分布的数据进行训练和测试数据分布不匹配时的偏差与方差的分析处理数据分布不匹…

程序员过关斩将--搞定秒杀,只需要这几步!!

“灵魂拷问秒杀这种大并发的写场景&#xff0c;直接分库分表开干&#xff1f;应对秒杀活动的流量高峰很难吗&#xff1f;不要拿淘宝级别的秒杀忽悠我秒杀活动特点我敢说凡是做过电商的同学&#xff0c;都会遇到运营展开的秒杀&#xff0c;限时购等“高并发”的活动。市面上也有…

吴恩达DeepLearningCourse4-卷积神经网络

部分内容参考之前的笔记 PyTorch深度学习实践 文章目录第一周&#xff1a;卷积神经网络边缘检测Padding、Stride三维卷积卷积神经网络中的一层池化层第二周&#xff1a;深度卷积网络实例探究残差网络1x1卷积Inception模块和网络卷积神经网络的迁移学习第三周&#xff1a;目标检…

那些鼓吹国内首个.NET 5框架的,该醒醒了!

前两天看过园子里有篇【国内首个 .NET 5 框架 XX 斩获 XXX stars&#xff0c;XXX 发布】&#xff0c;一顿羡慕嫉妒恨啊。我这.net core 3.1才上手没几天,还没用热乎呢&#xff0c;你这.NET 5的框架都出来了。我好难啊&#xff01;不过难归难咱也得跟上啊。于是一个天高云淡的的…

吴恩达DeepLearningCourse5-序列模型

终于在八月末学完了这门课程&#xff0c;这个月虽然为此不停地忙碌&#xff0c;但每天都在进步也是一种乐趣。 吴恩达教授的课程循序渐进&#xff0c;适合初学者&#xff0c;非常感谢他的辛苦付出。 文章目录第一周&#xff1a;循环序列模型循环神经网络&#xff08;RNN&#…

IdentityServer4系列 | 客户端凭证模式

一、前言从上一篇关于 快速搭建简易项目中&#xff0c;通过手动或者官方模板的方式简易的实现了我们的IdentityServer授权服务器搭建&#xff0c;并做了相应的配置和UI配置&#xff0c;实现了获取Token方式。而其中我们也注意到了三点就是&#xff0c;有哪些用户(users)可以通过…

数据结构 - 链表

准备重启尘封一年的博客作为学习笔记&#xff0c;看看自己能坚持多久。 最近会记录做过的算法题&#xff0c;语言描述只用于会意&#xff0c;仅供参考。 文章目录0.从尾到头获取链表的值&#xff08;不是反转链表&#xff09;1.寻找/删除单链表倒数第k个节点3.寻找单链表的中点…

[读书笔记] 《修炼之道:.NET 开发要点精讲》

《修炼之道:.NET 开发要点精讲》目录《修炼之道:.NET 开发要点精讲》第 1 章 另辟蹊径&#xff1a;解读.NET1.7 本章思考 > 位置 465第 2 章 高屋建瓴&#xff1a;梳理编程约定2.2 方法与线程的关系 > 位置 5192.7 线程安全 > 位置 5952.8 调用与回调 > 位置 6612.…