对CLR施加内存限制
本文关键字:内存 施加 CLR | 更新日期: 2023-09-27 18:17:37
我想测试我的代码在有限内存情况下的错误处理。
我也很想知道在低内存的情况下,我的代码的性能是如何受到影响的,在这种情况下,可能需要更频繁地运行GC。
是否有一种方法来运行。net应用程序(或NUnit测试套件)与有限的内存?我知道Java可以限制JVM访问的内存量——在。net中也有类似的东西吗?
这不是CLR中的选项。内存的管理非常不同,一个。net进程中至少有10个不同的堆。. net程序可以不受限制地使用Windows进程中可用的全部虚拟内存空间。
最简单的方法是在程序启动时分配内存。你必须小心一点,你不能一次吞下太多,地址空间是碎片化的,因为它包含不同地址的代码和数据的混合。内存从中间的孔分配。要在可用地址空间中投入大量资源,您必须分配至少1gb的空间,而单次分配是不可能的。
所以使用循环来分配较小的块,比如每次1兆字节:
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 Job Object中。您可以为作业设置内存(和其他)限制。这是限制进程可以使用的内存量的最干净和唯一相同的方法。