【问题标题】:Trying to allocate maximum possible memory to process尝试分配最大可能的内存来处理
【发布时间】:2014-06-16 14:33:22
【问题描述】:

这是在 Windows XP 上,应用程序正在用 C++ (VS2010) 开发。

我希望我的应用程序继续分配内存,直到达到其限制而没有任何问题。但如果它分配整个 2GB(32 位 Windows 的最大限制),它会覆盖堆栈空间并最终崩溃。如何避免这种情况? (顺便说一句,我使用mallocnew 进行内存分配)

  1. 在“Private Bytes”、“Virtual Bytes”和“Working Set”中,我相信我应该监控“Virtual Bytes”。但我对此并不完全确定。 (是“Virtual Bytes”还是“Private Bytes”当触及 2GB 时我们可以确定我们触及了限制?)

  2. 如果是“Virtual Bytes”我要监控,我不确定_PROCESS_MEMORY_COUNTERS_EX的哪个字段反映了virtual bytes

  3. 为了让应用程序安全流畅地运行,我应该保留多少内存? (只是堆栈大小 = 线程数 x 每个线程的堆栈大小 还是有更多的东西)

【问题讨论】:

  • 你为什么要这样做?
  • 检查 malloc 返回值(根据编译设置还有新的返回值)。 NULL(或异常)就是因为这个原因。你甚至不能仅仅因为你需要连续的空间而检查空闲内存。由于各种开销,计算并不那么直接。
  • 你不应该把记忆放在一边。您应该根据需要分配内存,并注意并处理内存分配错误(malloc 在内存错误时返回 NULL)。
  • 您确定不是您的应用程序代码在 malloc 开始失败时覆盖了您的堆栈?或者,也许是您正在使用的库?
  • 如果分配失败,它不会覆盖堆栈...您只会得到 NULL(这可能会损坏应用程序或触发访问冲突)。堆栈溢出可能是由其他原因引起的(例如......当没有连续的可用内存块时,动态堆栈将无法增长)。

标签: c++ c memory memory-management


【解决方案1】:

程序管理器将为您的堆栈和其他数据留出空间。您可以调用 malloc 和 new 直到它们返回 0 (NULL)。我认为 Working Set 是你需要监控的变量。

【讨论】:

  • 分配 2GB 后,我观察到我的应用程序变得不稳定并出现“堆栈溢出”错误。此外,“工作集”是分配给物理 RAM 的,并且可能是更多已分配的内存,这些内存可能已经分页到磁盘。
  • 你能发布你的源代码,以便我可以在我的机器上测试它吗?
  • @GeoAoe,抱歉延迟回复。它太大了,无法发布。我正在试验它。我猜问题出在其他问题上,并导致“堆栈溢出”错误。另外,大约2GB内存消耗,启动新线程也会报错R6016 - not enough space for thread data
【解决方案2】:

通过修改 boot.ini 文件,您最多可以访问 3Gb

[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /3GB

然后您需要使用 editbin 修改您的可执行文件(也带有 express 版本)

editbin /LARGEADDRESSAWARE xxx.exe

这对我有用。如果这不起作用,则缺少可选标题。我不知道你是如何强制标头在那里的。

如果你有很多时间 - 这就是长篇大论http://www.dansdata.com/askdan00015.htm

【讨论】:

  • 这是他的应用程序,所以他可能想直接使用 /LARGEADDRESSAWARE 作为链接器选项。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2023-03-20
  • 2014-12-29
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多