c# - 对 CLR 施加内存限制

标签 c# .net clr

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

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

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

最佳答案

这不是 CLR 中的一个选项。内存的管理非常不同,一个 .NET 进程中至少有 10 个不同的堆。 .NET 程序可以不受限制地使用 Windows 进程中可用的整个虚拟内存空间。

最简单的方法是在程序启动时分配内存。你必须要小心一点,你不能一口气吞下太多,地址空间是碎片化的,因为它包含不同地址的代码和数据的混合。内存是从中间的孔分配的。要严重减少可用地址空间,您必须分配至少 1 GB 的空间,而单次分配是不可能的。

所以只需使用循环来分配较小的 block ,比如一次 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。

关于c# - 对 CLR 施加内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16988027/

相关文章:

c# - 当 Gacutil.exe 拒绝服务时如何从 GAC 中删除 dll

c# - clr 线程模型信息?

用于清理 html 的 C# 库

c# - Json.NET:反序列化 json 数组

c# - 只要没有单击任何项​​目,就阻止 ToolStripDropDownButton 关闭

.net - LINQ - 数组属性包含另一个数组中的元素

c# - 访问 UI 控件时是否应始终使用 Control.InvokeRequired

c# - 将结构列表从 C# 转换为 C++

c# - 手动创建的 global.asax.cs 文件不起作用

c# - 为什么 ASP.NET 会终止我的后台线程?