在仍有大量内存空闲时抛出'System.OutOfMemoryException'

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

这是我的代码:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

异常:引发类型'System.OutOfMemoryException'的异常。

我在这台机器上有4GB内存当我开始运行时,2.5GB是免费的,PC上有足够的空间来处理100000000个随机数的762mb。考虑到可用内存,我需要存储尽可能多的随机数。当我投入生产时,盒子上会有12GB,我想利用它。

CLR是否将我限制为默认的最大内存?我如何要求更多?

我认为把它分成更小的块,并增加我的内存需求将有助于解决内存碎片导致的问题,但无论如何我都无法超过总共256MB的ArrayList大小,无论我调整blockSize的大小

private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i++) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}

从我的主要方法:

int blockSize = 1000000;

while (true) {
  try
  {
    AddNDRandomNumbers(blockSize);                    
  }
  catch (System.OutOfMemoryException ex)
  {
    break;
  }
}            
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;
提问于
用户回答回答于

“内存不足”并不意味着可用内存量太小。最常见的原因是,在当前地址空间内,没有足够大的内存连续部分可用于所需的分配。如果您有100个块,每个4 MB大,当您需要一个5 MB块时,这不会对您有所帮助。

关键点:

  • 在我看来,我们称之为“进程内存”的数据存储最好被视为磁盘上大量文件
  • RAM可以被看作仅仅是性能优化
  • 您的程序消耗的虚拟内存总量与性能无关
  • “RAM耗尽”很少会导致“内存不足”错误。而不是错误,它会导致性能不佳,因为存储实际上位于磁盘上的全部成本突然变得相关。
用户回答回答于

你没有连续的内存块来分配762MB,你的内存被分割,分配器找不到足够大的空间来分配所需的内存。

  1. 您可以尝试使用/ 3GB(如其他人所建议的那样)
  2. 或切换到64位操作系统。
  3. 或修改算法,使其不需要大块内存。可能会分配一些较小(相对)的内存块。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问9 回答
  • 优惠活动秘书

    0 粉丝2 提问8 回答
  • _逗你玩_

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • uncle_light

    5 粉丝518 提问5 回答

扫码关注云+社区

领取腾讯云代金券