我需要限制 C# 程序使用的最大内存,即进行安排,以便如果其内存消耗超过一定限制,它将立即崩溃,而不是继续向操作系统请求更多内存。
(代码已经正确且高效,但内存消耗在运行时根据输入数据的不同而变化不可预测。某些输入数据集仅使用几兆字节后就可以正确得出结论。另一些输入数据集会导致它使用许多兆字节。在实践中,这意味着当虚拟内存系统疯狂地尝试满足请求时,它将使整个机器停止运行,然后崩溃。我希望程序立即崩溃,而不需要经历“使整个机器停止运行”部分。 )
它在 64 位 Windows 上运行;在大多数情况下,该限制实际上应为数十 GB,但以下测试用例尝试分配 1 GB;我试图让它崩溃而不是满足这个请求。
C:\t>type a.cs
using System;
class a
{
static void Main(string[] args)
{
var a = new byte[1024*1024*1024];
a[0] = 5;
Console.WriteLine(a[0]);
}
}
C:\t>csc a.cs
Microsoft (R) Visual C# Compiler version 3.5.0-beta4-20153-05 (20b9af91)
Copyright (C) Microsoft Corporation. All rights reserved.
https://learn.microsoft.com/en-us/dotnet/core/run-time-config/garbage-collector https://learn.microsoft.com/en-us/dotnet/core/run-time-config/garbage-collector表明实际上有一种方法可以将其设置为运行时参数,方法是在名为的文件中指定它runtimeconfig.json
。文档的某些部分建议文件名需要以程序名作为前缀,而有些则不需要;我正在尝试两种方法。
C:\t>type runtimeconfig.json
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapHardLimit": 209715200
}
}
}
C:\t>type a.runtimeconfig.json
{
"runtimeOptions": {
"configProperties": {
"System.GC.HeapHardLimit": 209715200
}
}
}
该文档还建议这可以通过设置环境变量来完成。
C:\t>set DOTNET_GCHeapHardLimit=C800000
但以上都没有任何效果。
C:\t>a
5
我是否缺少有关如何使用上述内容的信息?或者有其他方法来限制最大内存使用量吗?