当内存仍然可用时抛出OutOfMemoryException

7 .net memory

我需要构建一个大的字符串列表并将其保存在内存中,但是在构建它时会抛出OutOfMemoryException.根据资源监视器,我仍然有1GB的内存可用.我发现这篇知识库文章解决了这个问题,但它似乎应该在框架1.1 SP1中修复(我使用的是3.5 sp1).

任何人都可以了解幕后发生的事情吗?.net框架是否限制单个进程(在32位系统上)可以使用多少内存?如果是这样,我可以看到原因,但没有意义的是应用程序只使用1.6GB,系统还剩下约1GB.

编辑 - 对于那些在这里提出更深入信息的人:

我有一个List(是的,我可以使用别的东西,但我现在只是原型.),我通过做一个Guid.NewGuid().ToString()生成一个随机字符串,然后把它扔进列表中.我想要做的是生成一个包含尽可能多的项目的列表,并测试查找特定项目的不同方法.我的第一个猜测是有些碎片正在进行,但除了下面的代码之外,我丢弃了所有碎片,但它仍然会发生.我不认为这个小片段会造成很多碎片,但我可能错了.

        List<string> blah = new List<string>();

        for (int i = 0; i < 50000000; i++)
        {
            blah.Add(Guid.NewGuid().ToString());
        }
Run Code Online (Sandbox Code Playgroud)

ang*_*son 9

问题可能不在于您没有"可用"内存,但更可能的是您将内存碎片化得太多以至于当您尝试将项目添加到列表中时,必须调整其大小,没有单个块可用内存可以容纳它.

这也会导致OutOfMemoryException.

列表有多大,换句话说,当你得到异常时,你有多少字符串,完全或大致?

你如何填写清单?您是否事先知道要添加的项目数量?如果是这样,您在构建列表时是否指定了容量?

如果您不知道,是否有可能弄明白,那么您可以指定该容量?


Pow*_*ord 9

Win32对内存的每个进程限制为2GB.嗯,实际上是4GB,但是2GB是为内核模式保留的,除非你设置了/ 3GB OS启动选项.