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

xyz*_*xyz 8 c++ operating-system memory-leaks memory-management

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

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

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

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

Ste*_*ker 2

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

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