0

我的一个进程显然是因为日志文件中的以下消息而一遍又一遍地重新启动:

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 

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

4

1 回答 1

5

这可能有几个原因,一个好的开始是知道你请求了多少内存。

我可以想到发生这种情况的两个原因,即分配负大小或大大小(超过 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 次 4 Mb,它将失败,因为 1 次分配必须返回连续内存。

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

于 2012-06-13T12:15:42.993 回答