我有一个很大的程序,我注意到内存在稳步增长,直到我的机器无法处理它,我必须重新启动它。
通常这会是一个内存泄漏,但是我使用了libasan和valgrind,这两个都找不到泄漏。
我怀疑的是,在代码内部的某个地方,由于一个逻辑错误,一个动态结构在不受控制的情况下增长。例如,一个向量被一次又一次地保留了更大的值。就As而言,这不是一个内存泄漏,因为它在程序终止时会被清除,但会有完全相同的效果。
可以使用哪些工具来尝试识别内存中的哪些对象最大?即试图定位实际上不是泄漏的“内存泄漏”。
发布于 2021-05-26 23:34:03
试试https://github.com/vmware/chap
它将帮助您,因为它计算分配之间的引用图,并识别std容器使用的许多不同类型的分配。
在没有指令插入的情况下运行您的进程,直到它比您预期的要大得多,然后使用gcore收集一个活动的核心,在chap中打开该核心,并从https://github.com/vmware/chap/blob/master/USERGUIDE.md#analyzing-memory-growth中的建议开始。
发布于 2021-05-27 01:23:20
我被推荐在linux上使用heaptrack和heaptrack_gui来解决这个问题,它做的正是我需要解决这个问题的地方。它根据调用层次结构向您显示内存分配的火焰图,以便您可以逐个调用地缩小您可能过度分配的范围。
对于好奇的人来说,我的应用程序中的潜在问题是一个奇怪的vulkan图像,我忘记了释放它的内存。
https://stackoverflow.com/questions/67698661
复制相似问题