我正试图在有限的内存情况下测试我的代码的错误处理。
我也很想知道在低内存情况下我的代码性能如何受到影响,因为GC可能需要更频繁地运行。
有没有办法运行内存有限的.Net应用程序(或NUnit测试套件)?我知道用Java可以限制JVM可以访问的内存量 - 在.Net中是否有类似内容?
答案 0 :(得分:3)
这不是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。
答案 1 :(得分:1)
您可以将您的流程登记到Windows作业对象中。您可以为作业设置内存(和其他)限制。这是限制进程可以使用的内存量的最干净,唯一合理的方法。