代码之家  ›  专栏  ›  技术社区  ›  Paul

如果内存可用,为什么会抛出内存不足异常?

  •  9
  • Paul  · 技术社区  · 14 年前

    我有一个相当简单的C应用程序,它构建了一个大的哈希表。这个哈希表的键是字符串,值是int。

    根据任务管理器,我的程序只使用了797mb的内存,还有超过2gb的可用空间。它是一个32位的机器,所以我知道一个进程只能使用2gb的内存,但是哈希表仍然可以扩展到1.2gb。

    为什么会抛出内存不足错误?

    7 回复  |  直到 14 年前
        1
  •  11
  •   Davy8    14 年前

    从理论上讲,进程可以获得2GB的内存,但实际情况是它是2GB的连续内存,因此如果进程的内存是碎片化的,那么得到的内存就更少了。

    如果您知道它需要提前的大小(或者有一个合理的高估),那么在构造函数中指定容量可能会有所帮助。

    或者,如果它是否在内存中并不重要,那么某种数据库解决方案可能会更好,如果它确实达到了无法放入内存的程度,那么它会给您更大的灵活性。

        2
  •  4
  •   lornova    14 年前

    可能是由于内存碎片:您仍然有可用内存,但不是连续的。记忆分成两部分 ,通常大小为4KB,因此如果分配4MB,则需要1024个连续内存页 在进程寻址空间中 (他们还没有 身体上 连续的,因为每个进程都虚拟化了内存)。

        3
  •  3
  •   Patrick    14 年前

    使用Process Explorer(www.sysinternals.com)并查看进程的虚拟地址空间。与“私有字节”(进程占用的内存量)不同,虚拟地址空间显示的是使用中的最高内存地址。如果碎片是高的,它将远远高于“私有字节”。

        4
  •  1
  •   Lucero    14 年前

    你只是看错了栏目。看看“提交大小”列,这个应该是2GB左右。

    http://windows.microsoft.com/en-us/windows-vista/What-do-the-Task-Manager-memory-columns-mean

        5
  •  1
  •   Tim    14 年前

    由于visualstudio调试器试图跟踪您在应用程序中所做的一切(断点、引用、堆栈等),您正在运行的程序的资源有限。

    非常

        +-------+
        | large |       collected less often (~1/10+ cycles)
      +-+-------+-+              |
      |   medium  |              |
    +-+-----------+-+            V
    |     small     |   collected more often (~1/3 cycles)
    +---------------+
    

    注意:这些数字都是记忆中的数字,所以要谨慎对待。

        6
  •  0
  •   TcKs    14 年前

        7
  •  0
  •   Sean    12 年前