Memory management 使用mvvmCross帮助mono droid中的GC

Memory management 使用mvvmCross帮助mono droid中的GC,memory-management,garbage-collection,xamarin.android,mvvmcross,Memory Management,Garbage Collection,Xamarin.android,Mvvmcross,我正在使用slodge提供的mvvmcross框架处理mono droid。但是我有一些记忆问题。我正在activities ondestroy方法中处理位图,我想知道是否有可能帮助GC收集viewmodels的未使用对象。如果您尝试将活动中的viewmodel设置为null,那么一切都将化为乌有,而且这显然不是正确的方法 你们有什么建议吗 mvx框架试图确保活动拥有viewmodel 因此从理论上讲,在您的活动被销毁之后,gc应该能够收集您的所有c#对象—活动、它拥有的视图、视图模型和它拥有的

我正在使用slodge提供的mvvmcross框架处理mono droid。但是我有一些记忆问题。我正在activities ondestroy方法中处理位图,我想知道是否有可能帮助GC收集viewmodels的未使用对象。如果您尝试将活动中的viewmodel设置为null,那么一切都将化为乌有,而且这显然不是正确的方法

你们有什么建议吗


mvx框架试图确保活动拥有viewmodel

因此从理论上讲,在您的活动被销毁之后,gc应该能够收集您的所有c#对象—活动、它拥有的视图、视图模型和它拥有的对象

我所看到的错误是,任何“全局”或单一对象都拥有对视图或viewmodel对象的引用。例如:

  • 如果一个视图向一个单例(例如http映像加载器)注册了自己,然后该单例保留了对该视图的引用,从而防止它被垃圾收集

  • 如果viewmodel订阅了中心服务上的事件(通常是单例事件),但没有取消订阅-那么在这种情况下,viewmodel不能被垃圾收集(通常这也会阻止收集其他对象)

通常,这两种类型的错误都可以通过对“活动销毁”执行清理操作来解决。但是,也可以使用其他方法—例如,对于事件订阅,您可以尝试使用弱引用(这也是在其他平台上采用的方法—例如mvvm light的messenger)

根据经验,泄漏最明显的区域是像图像这样的“大物体”周围——它们的大小有助于它们变得明显。然而,monodroid的真正挑战是确定泄漏的位置——修复它们通常相对容易


遗憾的是,droid目前没有可用的内存分析器。如果您是交叉编译到wp7,那么对于viewmodel对象/泄漏,您当然可以使用其内存探查器。如果没有,那么我通常尝试解决内存泄漏的方法是放大它们——尝试编写一个快速复制它们的示例——例如通过向数据元素添加大字节[]成员或通过快速重复操作。一旦泄漏很容易被复制,那么您可以通过在终结器中放置跟踪语句、事件移除处理程序等来尝试查找泄漏。

我遇到了一个类似的问题,就是GC释放对象的速度不够快。我在OnDestroy中添加了“GC.Collect()”,它开始正常清理。即使我所有的图片都在版面中。