在CLR上施加内存限制

时间:2013-06-07 15:43:55

标签: c# .net clr

我正试图在有限的内存情况下测试我的代码的错误处理。

我也很想知道在低内存情况下我的代码性能如何受到影响,因为GC可能需要更频繁地运行。

有没有办法运行内存有限的.Net应用程序(或NUnit测试套件)?我知道用Java可以限制JVM可以访问的内存量 - 在.Net中是否有类似内容?

2 个答案:

答案 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作业对象中。您可以为作业设置内存(和其他)限制。这是限制进程可以使用的内存量的最干净,唯一合理的方法。