在32位.NET进程中分配超过1,000 MB的内存

Ste*_*tze 20 .net c# memory out-of-memory large-object-heap

我想知道为什么我无法在32位.NET进程中分配超过1,000 MB的内存.以下迷你应用程序在分配1,000 MB后抛出OutOfMemoryException.为什么1,000 MB,而不是说1.8 GB?是否有可以更改的流程范围设置?

static void Main(string[] args)
{
    ArrayList list = new ArrayList();
    int i = 0;
    while (true)
    {
        list.Add(new byte[1024 * 1024 * 10]); // 10 MB
        i += 10;
        Console.WriteLine(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:垃圾收集没有帮助.

编辑,澄清我想要的:我编写了一个服务器应用程序,在写入数据库/磁盘之前处理大量数据.我没有为所有内容创建临时文件,而是编写了一个内存缓存,这使整个过程非常快.但记忆是有限的,所以我试图找出限制是什么.并且想知道为什么我的小测试程序在完全1,000 MB之后抛出了OutOfMemoryException.

Mar*_*ell 16

拥有巨大的内存块永远不是一个好主意,即使在64位.你会遇到连续内存和碎片的大问题.

这里的问题是找到一个连续的块.您可以尝试启用3gb模式(这可能有助于它找到更多的字节)但我真的建议反对它.这里的答案是:

  • 使用更少的内存
  • 使用数据库/文件系统
  • 使用x64

您可能还想阅读Eric Lippert的博客(他似乎有一个关于每个常见.NET问题的博客条目......)

  • 约翰内斯,为什么会有更多的地址空间不能让它更容易找到更连续的地址空间?你对你的评论感到困惑.你可以解释吗? (2认同)

MyI*_*hin 7

Win32进程的虚拟地址空间限制为1.5GB(不完全正确).此外,在.NET框架中,.NET进程可以使用的内存百分比有限制.machine.config有一个processModel元素,其属性memoryLimit是进程可以使用的可用内存的百分比.默认值为60%.

如果您运行的计算机有2GB的内存,或者您没有在BOOT.INI中启用/ 3GB开关,那么每个进程将获得~1.3GB的内存.

我找不到知识库文章,但如果我没记错,无论你的设置如何,.NET 1.x都无法超越1.5GB(1.8GB?)的限制.

http://blogs.msdn.com/tmarq/archive/2007/06/25/some-history-on-the-asp-net-cache-memory-limits.aspx http://social.msdn.microsoft.com /论坛/ zh-CN/clr/thread/c50ea343-b41b-467d-a457-c5a735e4dfff http://www.guidanceshare.com/wiki/ASP.NET_1.1_Performance_Guidelines_-_Caching#Configure_the_Memory_Limit