【问题标题】:Helping the GC in mono droid using mvvmCross使用 mvvmCross 帮助 mono droid 中的 GC
【发布时间】:2012-09-11 18:25:08
【问题描述】:

我正在使用 slodge 提供的 mvvmcross 框架使用单声道机器人。但是我有一些记忆问题。我在 ondestroy 方法的活动中处理位图,我想知道是否可以帮助 GC 收集未使用的视图模型对象。如果您尝试将 Activity 中的视图模型设置为 null,那么一切都会变得糟糕透顶,这显然不是正确的方法。

你们对方法有什么建议吗?

问候

【问题讨论】:

  • 我遇到了类似的问题,即 GC 释放对象的速度不够快。我在 OnDestroy 中添加了“GC.Collect()”,它开始正确清理。即使我所有的图像都在布局中。

标签: memory-management garbage-collection xamarin.android mvvmcross


【解决方案1】:

mvx 框架试图确保 Activity 拥有视图模型。

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

我看到这个出错的地方是任何“全局”或单例对象都拥有对视图或视图模型对象的引用。例如:

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

  • 1234563物品也在收集中)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多