使用Profiller工具在Monotouch和Mvvmcross中进行内存泄漏调试

5

我一直在努力消除我们的单触控应用程序中的内存泄漏,并在过去几天学到了很多东西,例如几乎总是需要在垃圾回收成功之前取消挂钩某些事件 :)

但现在我一直在使用分析器工具进行试验,我可以看到大部分内存都被字符串(或看起来像是)使用,请参见以下屏幕截图: enter image description here

enter image description here

但正如您所看到的,一些内存也由mono使用。我一直在处理我们的视图模型和视图,其中大部分已正确进行垃圾回收。如果我查看字符串,它们有时会被引用并且我不知道该怎么处理这些信息。 您们有什么建议可以减少字符串使用的内存量吗 :) 我已经尝试查找任何可能解释这些数字含义的教程或类似教程,但没有成功。感谢您的帮助。

2个回答

3

以下是我个人经验中的一些答案:

  • 对于教程,我只知道 http://docs.xamarin.com/ios/Guides/Deployment%252c_Testing%252c_and_Metrics/Monotouch_Profiler

  • 我发现“反向引用”选项是最有用的功能之一——重要的不是你拥有很多字符串,而是谁拥有这些字符串。

  • 我发现寻找这些错误的最佳方法是在简单的测试工具和/或测试序列中复制它们——随着应用程序变得越来越大,并且我使用更多组件——MvvmCross、JSON.Net、SQLite-net 等等——以更多异步方式使用,那么我发现我需要减少这些组件的数量才能识别泄漏。

  • 一旦你有了一个简单的测试工具,HeapShot 中的过滤器选项会有所帮助——因为它让你专注于已知命名空间中的类。

  • 一旦你有了一个简单的测试工具,比较两个 HeapShot 也可以帮助——你的测试 UI 中的哪些操作导致 HeapShots 之间的增加?

    差异才是重要的——一些库故意将某些 PropertyInfo 缓存在内存中——例如,你的 HeapShot 图像中的一些 PropertyInfo 可能会被一个库故意缓存,以提高反序列化速度。


为了更容易地进行交叉引用,添加链接到相关问题:


另外还有一点……如果你已经做了几天了,那么你现在就是一个专家了——很想看到你在某个地方发布关于你所学到的东西(好的和坏的)。 - Stuart

2

除了Stuart的优秀回答之外,我想强调您应该在设备上进行性能分析。设备上的执行被调整为运行时性能,而模拟器被调整为构建性能(以便编辑和调试周期尽可能快)。这意味着在模拟器中,比在设备上更多的内存用于运行时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接