唉,我的程序在某个地方有内存泄漏,但如果我知道它是什么,我会被诅咒.
它的工作是读取一堆~2MB的文件,进行一些解析和字符串替换,然后以各种格式输出它们.当然,这意味着很多字符串,因此进行内存跟踪表明我有很多字符串,这正是我所期望的.程序的结构是一系列类(每个都在自己的线程中,因为我是一个白痴),它们作用于代表内存中每个文件的对象.(每个对象都有一个输入队列,两端都使用锁.虽然这意味着我可以并行运行这个简单的处理,但这也意味着我有多个2MB对象位于内存中.)每个对象的结构都是由一个模式对象定义的. .
我的处理类在完成处理时引发事件,并传递对包含所有字符串的大对象的引用,以将其添加到下一个处理对象的队列中.使用函数调用替换事件以添加到队列不会阻止泄漏.其中一种输出格式要求我使用非托管对象.在类上实现Dispose()不会阻止泄漏.我已使用索引名称替换了对架构对象的所有引用.没有骰子.我不知道是什么导致它,不知道在哪里看.内存跟踪没有帮助,因为我看到的是一堆字符串正在创建,我没有看到引用在内存中的位置.
在这一点上,我们几乎要放弃并回滚,但我有一个病态的需要,确切地知道我是如何弄乱它的.我知道Stack Overflow无法完全梳理我的代码,但您可以建议哪些策略来跟踪此泄漏情况?我可能会在我自己的时间里这样做,所以任何方法都是可行的.
我尝试的一种技术是系统地减少演示问题所需的代码量,而不会使问题消失.这被非正式地称为"分而治之",是一种强大的调试技术.一旦你有一个演示相同问题的小例子,你就会更容易理解.也许记忆问题会在那时变得更加清晰.
只有一个人可以帮助你.那个人叫Tess Ferrandez.(沉默)
不过实话说.阅读她的博客(第一篇文章非常贴切).看看她如何调试这些东西,可以让你深入了解你的问题是怎么回事.