.net - CLR内存消耗问题

标签 .net performance clr

CLR 的问题之一是它在缺乏 RAM 时表现出极其糟糕的行为(当托管进程的一些内存被调出时,这会导致整个系统完全卡住,甚至 Ctrl-Alt-Del 屏幕也无法运行)无法访问。我认为原因是 GC 尝试构建可到达对象的图表并尝试扫描进程的所有内存,从而导致大量页入/页出操作。
这给我的 .NET 程序带来了一个问题,因为当输入数据很大时它会消耗大量 RAM。

我更愿意向用户显示“内存不足”消息,而不是完全挂起他的系统^_^
有什么办法可以实现这一点吗?

最佳答案

MemoryFailPoint ,您可以告诉 .NET 您将需要一定量的内存。 但问题是,即使这个系统也包含交换空间。

我相信在这里实现你想要实现的目标是非常困难的。比如说,您将使用一些系统指示器和性能指示器来找出有多少物理内存可用,并基于此执行一些任务。如果完成此检查后,另一个进程进入了物理内存,则您原来的计算不再适用,并且您的一些内存将被推送到交换区。

我确实有一个建议。您可以设置一个配置设置,其中包含应用程序允许使用的最大内存量吗?有了这个,您可以:

  1. 尝试根据例如,计算出您的应用程序消耗了多少资源。网络连接(如果您的应用程序是网络服务器)并根据最大内存消耗限制连接数,或者

  2. 您可以运行第二个线程,每隔 10 秒或每分钟检查一次 GC.GetTotalMemory() 的总内存消耗,并开始拒绝连接(同样,如果您的应用程序是网络服务器)一旦达到该最大值。

这应该是一个配置设置,而不是例如可用物理内存量,因为您不知道计算机上正在运行哪些其他应用程序。

关于.net - CLR内存消耗问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4145052/

相关文章:

.net - 为什么 'Function Body' 成为我的应用程序的瓶颈?

MySQL max-value——时间和频率

c# - 什么运行我的 C# 应用程序?

c# - Esent 和 Ravendb 中的 .Net 终结器顺序/语义

.net - 在正在运行的进程中检测类的未处理实例?

c# - 一张表中的一条记录与另一张表中的多条记录之间的关系

c# - 将 WebProxy 与 HttpClient.SendAsync() 和 HttpRequestMessage 结合使用

c# - 为什么在 C# 应用程序中将 IL 代码打包到 exe 中?

android studio卡在刷新gradle项目

C++ 到 CLR 的字节码编译器?