得到std :: bad_alloc错误;如何交叉验证操作系统是否真的耗尽内存

时间:2012-06-18 07:01:43

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

我有一个C ++程序/ Linux,它在运行的2-3秒内开始在32GB RAM上吐出错误std::bad alloc(并由包装调用者重新启动)。我真正关心的是解决这个问题,但我想一步一步地建立我对这个问题的理解的信心。

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

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

理想情况下,我希望在内存分配失败的时候获得系统统计信息,例如缓存,总耗尽内存等。

1 个答案:

答案 0 :(得分:2)

如果您确实想查看进程内存的分配方式,可以在抛出异常时设置gdb的断点。如果是,请使用pmap之类的工具检查流程,该工具可以显示有关流程如何使用内存的其他信息。

如果这太原始了(并且很快就会出现pmap非常原始),valgrind包括Massif和许多其他实用程序,用于诊断内存使用,CPU利用率和其他运行时问题。