【发布时间】:2014-05-25 07:47:25
【问题描述】:
我正在进行测试以检测类的内存泄漏。我使用以下模式执行此操作:
- 在测试设置中获取初始内存(使用
GC.GetTotalMemory(true)) - 执行操作,例如对象的实例化
- Dispose 对象(通过
useage块) - 在测试拆卸时获取内存(再次使用相同的方法,所有对象都超出范围,因此应该被垃圾回收)
- 理想情况下,断言初始内存和最终内存之间的差异 = 0
在我的测试中使用内存分析工具,我看到 const 字符串(和相关的)声明被计入测试的泄漏内存。我希望在进行初始内存测量时已经声明了这些值,这样它们就不会产生测试检测到的“泄漏”。但是,我不想运行操作代码两次,因为这会阻止我检测静态变量中的变量泄漏(比如没有清理不应该具有应用程序生命周期的单例模式对象)。
有没有办法做到这一点?我是否必须对每个测试用例的这些变量进行手动补偿(其缺点是必须积极维护,从长远来看这可能不会发生)?运行时有没有可以用于此目的的时刻?还是我必须接受我无法测试接近 0 字节的内存泄漏?
(对于那些感兴趣的人:我已经在使用 WeakReferences 和 livelyness 检查来监控我在测试中实例化的对象是否被正确地垃圾收集,但这不会涵盖泄漏的私有状态)
【问题讨论】:
标签: c# testing memory-leaks