6

背景:我正在尝试追踪 Xamarin.Android 应用程序中的内存泄漏。使用 DDMS 和 Eclipse Memory Profiler,我可以看到哪些对象是活动的。当试图追踪让它们存活的东西(GC Root)时,我只看到“Native stack”(当然)。

如何获取 MONO VM 的堆快照?那么我以后可以将它与ie heapshot 工具一起使用吗?

或者是否有任何其他技术可以用来查找在 Xamarin.Android 的 .NET 部分中保持对象存活的内容?是否可以在程序中做某事?

4

2 回答 2

12

如何获取 MONO VM 的堆快照?那么我以后可以将它与ie heapshot 工具一起使用吗?

现在可以获取 Mono VM 的堆快照(使用 Xamarin.Android 4.8.2 beta 测试;可能适用于以前的版本,您的情况可能会有所不同)。这是一个四步过程:

  1. 启用 heapshot 日志记录:

    adb shell setprop debug.mono.profile log:heapshot
    
  2. 启动您的应用程序。(如果您的应用程序在 (1) 之前已经运行,请终止并重新启动它。)

    使用您的应用程序。

  3. 获取应用的配置文件数据:

    adb pull /data/data/@PACKAGE_NAME@/files/.__override__/profile.mlpd
    

    @PACKAGE_NAME@是您的应用程序的包名称,例如,如果您的包是FooBar.FooBar-Signed.apk,那么@PACKAGE_NAME@将是FooBar.FooBar

  4. 分析数据:

    mprof-report profile.mlpd
    

    mprof-report包含在 Mono 中。

注意profile.mlpd仅在发生 GC 时更新,因此您可能需要GC.Collect()某个“众所周知”的点调用以确保profile.mlpd定期更新。

于 2013-10-01T21:13:47.820 回答
4

我在 Xamarin Android 内存分析方面遇到了麻烦,并使用了一些技巧:

  1. 在 Dalvik 方面,我使用 Android Monitor 转储堆快照,然后使用 JProfiler 或 Eclipse MAT 打开它。这个标准的安卓。

  2. 我的大部分代码是共享的(70-80%),为了验证这一点,我构建了一个简单的 WinForms 应用程序来驱动共享 API。通过这种方式,我可以使用 .Net Memory Profiler(或 ANTS,如果您愿意的话)以及 dotTrace 来提高性能。通过这种方式,我可以轻松挑选出不少问题。

  3. 通过使用上面@jnop 解释的解决方案,我可以在 Mono 的 HeapShot 工具中打开 profile.mldp 并获得一个可视化工具,而不是 mprof-report 文本输出。

顺便说一句,应该投票给更好的分析器:http: //xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler

于 2014-02-11T14:25:31.947 回答