【问题标题】:Why am I getting std::bad_alloc when I have so much free memory available当我有这么多可用内存时,为什么我会得到 std::bad_alloc
【发布时间】:2012-06-16 09:20:29
【问题描述】:

显然,由于日志文件中的以下消息,我的一个进程正在一遍又一遍地重新启动:

Wed Jun 13 10:07:32 2012: terminate called after throwing an instance of 'std::bad_alloc'

Wed Jun 13 10:07:32 2012:   what():  St9bad_alloc

我知道这是因为它无法为“新”请求分配内存。我不明白的是,“free -m”告诉我有很多可用内存可以丢弃缓存:

-bash-3.00$ 免费-m

         total       used       free     shared    buffers     cached

Mem:         32175      32113         61          0        412      24021

-/+ buffers/cache:       7679      24495

Swap:        12287          0      12287 

这是因为空闲内存(当前缓存)非常少,但我猜为了迎合“新”请求,可以释放此缓存。或者我是否需要打开某些东西来强制释放缓存或这里出了什么问题?

【问题讨论】:

  • 你知道你尝试分配多少内存吗?
  • 你能调试一下吗?打破抛出异常并检查值是什么。可能是您要求的内存过多(例如 10Gb)或过少(负值)。它们都可能因std::bad_alloc 而失败。
  • 当我尝试调试它并找出更多信息时,这里可能有用的一件事是我的系统在一个配置文件上工作,该文件具有要处理的类似事物的列表。 Uptil 大量的项目,系统工作正常。只有当我在此阈值之后添加时,此错误才会开始发生。所以我认为代码的基本正确性没有任何问题,例如尝试分配 -ve 内存或随机巨大的内存等。但这只是一个猜测。
  • 您何时运行free -m?除非您在Wed Jun 13 10:07:32 2012 之前运行它,否则它不会告诉您分配失败时有多少可用内存。也许你的应用程序有大量的内存泄漏,当它终止时,所有这些当然都会被释放。它会正常工作,直到你的内存用完,然后抛出异常。
  • 我使用 sar 命令来检查可用内存的历史记录和缓存的缓冲区,它们就像 24 GB(总 RAM 为 32 GB)..在这种情况下,很难理解为什么操作系统不能释放此缓存以满足“新”请求(并且还考虑到我在添加一个要处理的项目时遇到了这个问题——请阅读我之前的评论)

标签: c++ memory-management memory-leaks operating-system


【解决方案1】:

这可能有几个原因,一个好的起点是知道您请求了多少内存。

我可以想到发生这种情况的两个原因,即分配负大小或大大小(超过 4GB 的 32 位机器)。或碎片问题(可能在大量无分配调用后发生,但并不常见。)

要查看内存碎片,您可以使用神奇的 SysRq 键。只需执行以下命令:

echo m > /proc/sysrq-trigger 此命令会将当前内存信息转储到 /var/log/messages。以下是 RHEL3 32 位系统的示例:

7 月 23 日 20:19:30 localhost 内核:0*4kB 0*8kB 0*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 1952kB)

==编辑== 如何读取结果:当系统启动时,它会将内存分成 4Mb (4096Kb) 的连续内存块。当您的系统分配内存时,这些块会被分割成更小的大小,操作系统将分配最接近的两个内存块。

所以“1*1024kB”表示系统中有一块 1 Mb 的连续内存。

在这种情况下:“4*1024kB 0*2048kB 0*4096kB”虽然您确实有 4Mb 空闲空间,但仍分为 4 个 1Mb 块。如果您向操作系统请求 1 次 4 Mb 分配,它将失败,因为 1 次分配必须返回连续内存。

我希望这些对你有意义(-;

【讨论】:

  • +1 从请求的内存量开始。碎片不会将内存显示为 free(或 cached),因为它是分配给应用程序的内存,即使不是分配给任何特定对象。
  • 我有一台 RHEL 5.6 64 位机器并且 echo m > /proc/sysrq-trigger 在 /var/log/messages 中没有任何输出。有什么线索吗?
  • 还有如何理解你给出的输出? 1*512kB和0*4kB是什么意思?
  • 为此,您需要了解操作系统的内存管理。我将用高级解释编辑答案...
  • @Roee Gavirel - 我想你的意思是chunks 不是chanks
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2020-07-28
相关资源
最近更新 更多