2012-06-18 39 views
8

我有一个C++程序/ Linux,它在运行2-3秒内开始在32GB RAM上分配错误std::bad alloc(并由包装调用程序重新启动)。我真正关心的是解决这个问题,但我希望一步一步地建立起我对我对问题的理解的信心。获取std :: bad_alloc错误;如何交叉验证该操作系统是否真的内存不足

看起来系统无法为new请求分配内存(当操作系统内存不足时会发生这种情况)。程序运行时,在另一个终端上运行sar命令时可能的最小间隔(1秒),但我看到kbcached是〜24GB的内存。为什么操作系统无法释放缓存并使该内存可用于new请求? 1秒的时间太长(与程序运行速度相比)或者我在这里做错了。

基本上我想交叉验证并指出操作系统确实耗尽内存,因此无法分配内存,然后从这一点开始处理。怎么做?

理想情况下,我想有就在该点的系统统计信息时内存分配失败,好像多少缓存,总使用内存等

+2

只是一个说明..它与你如何拥有RAM无关,它取决于进程虚拟内存地址空间中存在多少空闲内存。我不知道命令来检查进程虚拟内存分配。 – Naveen

+0

我想这将是特定于操作系统的。 – sharptooth

+0

你的进程分配了多少内存?你的流程有什么限制?它是32位吗? –

回答

2

如果你真的想看到你的进程的内存是如何分配,您可以在抛出异常时使用gdb设置断点。如果是这样,请使用类似pmap的工具检查该进程,该工具可以向您显示有关进程如何使用内存的其他信息。

如果真是太原始了(并迅速将是,pmap是相当原始的),valgrind包括地块和许多其他工具来诊断内存使用率,CPU使用率,以及其他运行时的问题。

+1

值得注意的是(在这种情况下)valgrind地块工具。 Massif跟踪分配并允许在时间线上获得内存消耗的图形;并为每个快照标识分配的来源。 –

+0

@MatthieuM。也许你的评论应该是自己的答案? – RedX

+1

@RedX:没有别的话要说,所以我会让史蒂文将细节添加到他自己的答案中,如果他觉得值得的话。 –