可能重复:
Tips/Techniques for tracking down leaks in monotouch programs?
我有一个MonoTouch应用程序,我发现使用Instruments有一些内存泄漏。我不太确定如何开始寻找问题所在的位置。你能否指出我在我的应用程序中应该寻找可能导致一些泄漏的顶级事物的正确方向?
我认为由于垃圾收集,对象会被自动清理。如果有些情况不是这样,我想知道它们是什么。
答案 0 :(得分:4)
基本上,垃圾收集系统中的“泄漏”与程序本身必须管理内存的传统系统略有不同。在后者中,仅通过分配内存而不释放内存就会发生内存泄漏。可能没有引用分配的内存,但由于没有自动回收它的方法,分配将永远存在并被认为是泄漏。
在GC系统中,内存泄漏通常更多地是关于开发人员的看法:'作为开发人员,我不明白为什么我的应用程序使用这么多内存',因为GC只会收集未被引用的对象。
有人可能会说GC改变了逻辑 - 在传统系统中,当引用“丢失”(=没有引用对象(或其他),因此没有办法释放分配时)会发生泄漏,但是当引用 时,会发生GC系统泄漏。
因此,您基本上在寻找可能被认为是垃圾但仍在您的代码中引用的对象。根据程序的大小和复杂程度,这可能是一个简单或非常困难的问题。不幸的是我自己没有使用过MonoTouch,所以我无法提供有关工具的确切提示来帮助你(请参阅例如:Tips/Techniques for tracking down leaks in monotouch programs?),但是如果你有权访问堆(“直播”或通过转储),你或许可以推断某些对象的存在并不是你所期望的,然后通过跟随引用来理解哪个对象持有它们。
如果您只是阅读代码并尝试理解泄漏,我将首先检查与将对象存储到集合相关的逻辑。您是否多次向同一个集合添加一些对象(例如列表)?你应该从集合中删除一些对象但不是吗?