【问题标题】:.NET OutOfMemory exception with PAE.NET OutOfMemory 异常与 PAE
【发布时间】:2013-12-09 22:14:27
【问题描述】:

我有一个使用 PAE 在 Windows 2003 x86 上运行的应用程序。操作系统有 8 GB RAM。 在应用程序运行期间分配了一些内存,并且在主机进程增长到 ~1GB 并且总系统内存增长到超过 4GB 之后,我遇到了 OOM 异常。

当时大约有 4GB 的可用 RAM,单个进程大约有 1GB 到 2GB 的限制。

所以问题是:如果我有足够的空闲内存,这个异常的根源在哪里?

【问题讨论】:

  • 数组必须是程序地址空间中的单个连续内存块,您的程序可能只消耗总共 1GB 的内存,但分布在 3GB 的地址空间中。见:stackoverflow.com/a/14835279/288747
  • 你运行 32 位还是 64 位?
  • AFAIK,PAE 将可用内存扩展到 3GB,而不是 2GB。它不会消除所有限制。
  • PAE 是古老的银行转换技巧。它与垃圾收集器完全不兼容,因此 .NET 不支持它。通过将计算机更新到 64 位版本的 Windows,充分利用您拥有的所有内存。

标签: c# .net out-of-memory


【解决方案1】:

请记住回答“我的程序使用了多少内存?”这个问题。没有那么简单,答案取决于您测量的计数器

我会从一开始就使用Process Monitor 工具监控您的应用程序并观察:

  • 私有字节
  • 工作集
  • 虚拟字节

另请查看that question 以了解有关不同内存使用指标的更多详细信息。

由于我也是WinDbg的忠实粉丝,所以我会在发生OOM异常时对进程进行全内存转储并详细分析。

【讨论】:

    【解决方案2】:

    重要的不是系统有多少内存可用,重要的是你的进程有多少内存可用。由于您的进程是 32 位进程,因此硬限制为 4GB。

    所以你没有 4GB 的可用内存,系统有。您已使用分配的 4GB,但内存不足。

    前进的唯一方法是迁移到 64 位进程。显然,这需要 64 位系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2015-07-28
      • 2018-06-18
      • 2015-04-25
      • 2016-04-26
      • 2014-07-15
      相关资源
      最近更新 更多