5

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

但是现在我一直在使用分析工具,我可以看到大部分内存都被字符串使用(或者看起来),请看下面的屏幕转储: 在此处输入图像描述

在此处输入图像描述

但正如您所见,mono 也使用了一些内存。我一直在处理我们的视图模型和视图,其中大部分都是正确收集的垃圾。如果我查看有时引用它们的字符串,我不知道如何处理这些信息。如果我可以减少字符串使用的内存量,你们有什么建议吗 :) 我试图找到任何可能启发这些数字含义的教程或类似内容,但没有运气。任何帮助表示赞赏。

4

2 回答 2

3

我个人经验的一些答案:

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

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

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

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

  • 一旦你有了一个简单的测试工具,那么比较两个 HeapShot 也会有所帮助 - 你的测试 UI 中的哪些操作会导致 HeapShot 之间的增加?

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


为了更容易交叉引用,添加链接到链接问题的链接:

于 2013-02-11T13:48:51.867 回答
2

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

于 2013-02-11T14:23:35.743 回答