Memory 如何测试内存泄漏?
我们有一个具有数百种可能的用户操作的应用程序,并考虑如何增强内存泄漏测试 目前,它是这样发生的:当手动测试软件时,如果我们的应用程序似乎消耗了太多内存,我们使用内存工具,找到原因并修复它。这是一个相当缓慢且效率不高的过程:问题发现较晚,并且依赖于一个开发人员的良好意愿 我们如何才能改进这一点Memory 如何测试内存泄漏?,memory,memory-leaks,Memory,Memory Leaks,我们有一个具有数百种可能的用户操作的应用程序,并考虑如何增强内存泄漏测试 目前,它是这样发生的:当手动测试软件时,如果我们的应用程序似乎消耗了太多内存,我们使用内存工具,找到原因并修复它。这是一个相当缓慢且效率不高的过程:问题发现较晚,并且依赖于一个开发人员的良好意愿 我们如何才能改进这一点 内部检查某些操作(如“关闭文件”)是否恢复了一些内存并记录了它 在单元测试中断言内存状态(但这似乎是一项乏味的任务) 是否定期手动检查 每次实施新用户故事时是否包括该检查 在我的公司,我们为我们的应用程序
- 内部检查某些操作(如“关闭文件”)是否恢复了一些内存并记录了它
- 在单元测试中断言内存状态(但这似乎是一项乏味的任务)
- 是否定期手动检查
- 每次实施新用户故事时是否包括该检查
- 具有公共内存的检查表 与分配相关的错误 开发者
- 编码准则
- 代码审查
- 静态代码分析(作为构建过程的一部分)
- 内存分析工具
- 代码覆盖率(使用gcov
or)
- 内存使用率(带)
- 用户操作本身的覆盖范围
- 对于每一对动作A和B,如果有一个有意义的动作序列,其中A紧跟着B,那么我们已经测试了这样一个序列
- 在我的公司,我们为我们的应用程序编程了一条无休止的行动路径。java垃圾收集器应该清理所有未使用的映射和列表等。因此,我们让应用程序从无休止的操作路径开始,看看内存使用大小是否在增长
检查哪些字段未被删除您可以使用JProfiler for Java。哪种语言
我会使用Valgrind之类的工具,尝试充分运用程序,看看它报告了什么。第一道防线:
如果使用非托管语言(如C/C++),可以通过劫持内存管理函数有效地发现大部分内存泄漏。例如,您可以跟踪所有内存分配/释放。在我看来,问题的核心与其说是查找内存泄漏,不如说是知道何时测试内存泄漏。你说你有很多用户操作,但你没有说什么用户操作序列是有意义的。如果你能随机生成有意义的序列,我很难支持随机测试。在随机测试中,你会测量
一般来说(不是关于测试,而是为了解决问题的根源),smartpointers有助于避免这个问题。幸运的是,C++11标准提供了新的方便的智能指针类(
shared_ptr
,unique_ptr
)。您使用的是什么语言?它是垃圾收集语言,像java或perl还是非GC语言,如C++或C++?有静态分析工具、内存分析工具和其他可用的技术,但是如果没有关于实现的任何细节,就很难给出可用的答案。