繁体   English   中英

当我有太多可用内存时,为什么会得到std :: bad_alloc

[英]Why am I getting std::bad_alloc when I have so much free memory available

我的进程之一是一遍又一遍地重启,显然是由于日志文件中的以下消息:

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 

难道是因为可用内存(具有当前缓存)非常少,但我想为了满足“新”请求,可以释放这种缓存。 还是我需要打开一些强制释放缓存的东西,或者其他什么地方出了问题?

可能有几个原因,一个好的开始是知道您要多少内存。

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

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

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

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

== EDIT ==如何读取结果:当系统启动时,它将内存分成4Mb(4096Kb)的连续内存块。 每当您的系统分配内存时,这些块将被拆分为较小的大小,并且操作系统将分配两个内存块的最接近的功能。

因此,“ 1 * 1024kB”表示系统中有1 Mb的连续内存。

在类似“ 4 * 1024kB 0 * 2048kB 0 * 4096kB”的情况下,尽管您确实有4Mb的空闲空间,但仍分成4个1Mb块。 如果您请求操作系统分配1 Mb的内存为4 Mb,则会失败,因为1分配必须返回连续的内存。

我希望这对您都有意义(-;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM