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秒是太多时间(与程序运行的速度相比)或者我在这里做错了.
基本上我想交叉验证并确定操作系统确实耗尽内存,因此无法分配内存,然后从这一点开始.怎么做?
理想情况下,我希望在内存分配失败的时候获得系统统计信息,例如缓存,总耗尽内存等.
如果您确实想查看进程的内存是如何分配的,您可以gdb
在抛出异常时设置一个断点。如果是这样,请使用pmap等工具检查进程,它可以向您显示有关进程如何使用内存的其他信息。
如果这太原始了(很快就会变得pmap
非常原始),valgrind包括 Massif 和许多其他实用程序,用于诊断内存使用情况、CPU 利用率和其他运行时问题。