检查c++应用程序运行时的各种内存使用情况
Checking all sorts of memory usage during the runtime of a C++ Application
我正在使用CentOS 7,我正在运行一个c++应用程序。最近,我切换到一个新版本的库,该库用于应用程序的各种MySQL C API功能。但是在集成了新的库之后,我发现程序的内存使用量大幅增加,也就是说,如果运行超过一两天,应用程序就会崩溃。确切地说,应用程序的内存使用开始增加,直到一个应用程序使用了系统总内存的74.9%,然后它被系统强制关闭。
是否有任何方法可以跟踪整个应用程序的内存使用情况,包括静态变量。我已经尝试了valgrind的工具Massif。
谁能告诉我内存使用量增加的可能原因是什么,或者有什么工具可以让我深入了解内存是如何分配的(静态和动态)?有没有什么工具可以告诉我们在linux环境下运行的c++应用程序的内存分配?
提前感谢!
程序启动时分配静态内存。你是否看到内存增长或初创公司增长?
由于需要"一两天崩溃",问题可能是内存泄漏或数据结构的无限增长。Valgrind应该能够在这两方面提供帮助。如果valgrind使用——leak-check-full选项显示了一个大泄漏,那么您可能已经发现了问题。
要检查无限增长,请在程序中怀疑堆已经增长的位置放置一个抢占式_exit()。例如,在主循环上放置一个计时器,并在10分钟后让program_exit退出。如果valgrind显示了一个很大的"在退出时正在使用",那么您可能有数据结构的无限增长,但没有泄漏。Massif可以帮忙追踪。ms_print给出了函数栈分配的详细信息。
如果发现问题,请尝试切换回旧版本的库。如果问题消失了,检查并确保在新版本中正确使用了API。如果您没有源代码,那么您就会在修复方面陷入困境。
如果您想要做更多的工作,您可以为malloc/free编写一个共享库interposer来查看正在发生的事情。这是一个良好的开端。Linux具有回溯功能,可以帮助确定确切的堆栈。
最后,如果你必须使用第三方库,并且发现堆在没有绑定或泄漏的情况下增长,那么你可以使用共享库中介器直接调用free/delete。这是一种冒险的最后一招,不推荐使用,但我已经在生产环境中使用了这种策略来缓慢推进流程。
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 针对某些特定用例的C++原子内存排序
- 用C++压缩内存中的位图
- 用c++防止内存泄漏
- 内存浪费?如果main()应该只返回0或1,那么为什么main是用int而不是短int甚至char声明的
- 大约"circular reference",我用了weak_ptr但仍然发生内存泄漏
- 你能用内存反序列化字节吗?
- 使用重载的 new 和 delete 运算符跟踪已用内存
- 用C 和Marshall分配给C#的内存
- 当我用clang编译代码时,GCOV会出现内存错误
- 用多个传感器克服Arduino内存限制
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- CUDA:共享内存的超载以用多个数组实现还原方法
- 我可以动态分配以前分配的内存,但用不同的指针分配
- 从多个线程写入内存区域是否会导致争用?
- 用valgrind分析c++字符内存泄漏
- 为什么用空函数运行std::线程会花费大量内存
- 用new分配4k int后的内存覆盖
- 定义一个C宏并将内存地址设置为用C和C++编写的结构成员
- 除了内存管理,QObject的父级是做什么用的?