我一直致力于消除单声道触摸中的内存泄漏,并在过去几天中学到了很多东西,例如:几乎总是某些事件需要在垃圾收集成功之前解开:)
但是现在我一直在使用profiller工具,我可以看到大部分内存都被字符串使用(或者似乎),请参阅以下screendump:
但是你可以看到单声道也使用了一些内存。我一直在处理我们的视图模型和视图,其中大部分是垃圾收集正确的。如果我查看它们有时被引用的字符串,我不知道该如何处理这些信息。 如果我可以减少字符串使用的内存量,你们有没有任何建议:)我试图找到任何教程或类似的东西可能会让这些数字意味着什么,但没有运气。任何帮助表示赞赏。
答案 0 :(得分:3)
根据我个人经验得出的一些答案:
对于教程,我只知道http://docs.xamarin.com/ios/Guides/Deployment%252c_Testing%252c_and_Metrics/Monotouch_Profiler
我发现'反向引用'选项是最有用的功能之一 - 重要的不是你有很多字符串,而是拥有这些字符串的内容。
我发现寻找这些错误的最佳方法是在简单的测试工具和/或测试序列中重现它们 - 随着应用程序变得越来越大,我使用越来越多的组件 - MvvmCross,JSON.Net,SQLite- net等 - 以越来越多的异步方式,然后我发现我需要减少这些组件的数量来识别泄漏。
一旦你有一个简单的测试工具,HeapShot中的过滤器选项会有所帮助 - 因为它可以让你专注于已知命名空间中的类。
一旦你有一个简单的测试工具,那么比较两个HeapShot也会有所帮助 - 测试用户界面中的哪些操作会导致HeapShots之间的增加?
差异是重要的 - 一些图书馆故意将内容缓存在内存中 - 例如您的HeapShot图像中的一些PropertyInfo可能会被其中一个库故意缓存,以提高反序列化速度。
为了便于交叉引用,请添加指向关联问题的链接:
答案 1 :(得分:2)
除了斯图尔特的好答案之外,我还要强调你应该在设备上进行分析。调整设备上的执行以获得运行时性能,同时针对 build 性能调整模拟器(以便编辑调试周期尽可能快)。除此之外,它意味着在模拟器中,在运行时使用的内存比在设备上使用的内存更多。