8

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

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

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

理想情况下,我希望在内存分配失败时获得系统统计信息,例如缓存量、总内存使用量等。

4

1 回答 1

2

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

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

于 2012-06-18T07:21:35.453 回答