限制C#程序使用的最大内存

3
我需要限制C#程序使用的最大内存,即安排当其内存使用量超过一定限制时,立即崩溃而不是继续向操作系统请求更多内存。
(代码已经正确和高效,但内存消耗在运行时根据输入数据的不确定性变化。有些输入数据集只使用了几兆字节就正确地结束了,而其他一些数据集会导致它使用数万兆字节。实际上,这意味着它将会使整个机器停止运转,因为虚拟内存系统试图疯狂地满足请求,然后崩溃。我希望程序立即崩溃,而不是经历整个机器停止运转的部分。)
这是在64位Windows上运行的; 在大多数情况下,限制应该在数十GB范围内,但以下测试用例尝试分配1GB;我正在尝试让它崩溃,而不是满足此请求。
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提供了一种在运行时设置参数的方法,即通过在名为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

有关如何使用上述内容,我是否遗漏了某些内容?或者还有其他方式来限制最大内存使用量吗?
2个回答

2

我看了一下我在VS2022中创建的一个名为Mime.exe的早期.NET 6控制台项目,在构建过程中它会在输出目录中创建一个Mime.runtimeconfig.json文件。因此,该文件名以可执行文件的名称为前缀。以下是带有工作堆限制的内容,仅供参考:

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "6.0.0"
    },
    "configProperties": {
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
      "System.GC.HeapHardLimit": 1000000
    }
  }
}

1
假设您正在使用 PowerShell(已在 .NET 6 中测试):
  1. $Env:DOTNET_GCHeapHardLimit = 0x2000000
  2. 运行您的程序。
  3. 要在 C# 代码中检查它是否起作用,请使用:Console.WriteLine($"{GC.GetGCMemoryInfo().TotalAvailableMemoryBytes}");
您可能还需要考虑限制堆的数量(DOTNET_GCHeapCount)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接