3

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

我也很想看看在内存不足的情况下我的代码的性能如何受到影响,而 GC 可能必须更频繁地运行。

有没有办法在内存有限的情况下运行 .Net 应用程序(或 NUnit 测试套件)?我知道使用 Java,您可以限制 JVM 可以访问的内存量 - .Net 中有类似的东西吗?

4

2 回答 2

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。

于 2013-06-07T16:24:05.050 回答
1

您可以将您的进程登记到 Windows 作业对象中。您可以为作业设置内存(和其他)限制。这是限制您的进程可以使用的内存量的最干净和唯一明智的方法。

于 2013-06-07T16:25:54.833 回答