我正在尝试在内存有限的情况下测试我的代码的错误处理。
我也很想看看在内存不足的情况下我的代码的性能如何受到影响,而 GC 可能必须更频繁地运行。
有没有办法在内存有限的情况下运行 .Net 应用程序(或 NUnit 测试套件)?我知道使用 Java,您可以限制 JVM 可以访问的内存量 - .Net 中有类似的东西吗?
这不是 CLR 中的选项。内存的管理方式非常不同,.NET 进程中至少有 10 个不同的堆。.NET 程序可以不受限制地使用 Windows 进程中可用的整个虚拟内存空间。
最简单的方法是在程序启动时分配内存。你必须要小心一点,你不能一口气吞下太多,地址空间是碎片化的,因为它包含不同地址的代码和数据的混合。内存是从它们之间的孔中分配的。要严重影响可用地址空间,您必须至少分配一个千兆字节,而单次分配是不可能的。
所以只需使用一个循环来分配更小的块,比如一次一兆字节:
private static List<byte[]> Gobble = new List<byte[]>();
static void Main(string[] args) {
for (int megabyte = 0; megabyte < 1024; megabyte++)
Gobble.Add(new byte[1024 * 1024]);
// etc..
}
请注意,这非常快,分配的地址空间只是保留,不占用任何 RAM。
您可以将您的进程登记到 Windows 作业对象中。您可以为作业设置内存(和其他)限制。这是限制您的进程可以使用的内存量的最干净和唯一明智的方法。