如何获取Xamarin.Android的Mono VM的堆快照?

时间:2013-10-01 20:25:59

标签: android memory-leaks xamarin memory-profiling heap-dump

背景:我正在尝试追踪Xamarin.Android应用中的内存泄漏。使用DDMS和Eclipse Memory Profiler,我能够看到哪些对象是活着的。当试图追踪持有它们的东西时(GC Root),我只看到“原生堆栈”(当然)。

如何获取MONO VM的堆快照?所以我以后可以使用ie快照工具吗?

或者是否有任何其他技术可以用来找到Xamarin.Android的.NET部分中存放物体的内容?是否可以在程序中做一些事情?

2 个答案:

答案 0 :(得分:12)

  

如何获取MONO VM的堆快照?所以我以后可以使用ie快照工具吗?

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

  1. 启用快照记录:

    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中。

  5. 注意:发生GC时,仅{<1>} 更新,因此 想要致电profile.mlpd在一些&#34;众所周知的&#34;指出要确保GC.Collect()定期更新。

答案 1 :(得分:4)

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

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

  2. 我的大部分代码都是共享的(70-80%),为了验证这一点,我构建了一个简单的WinForms应用程序来驱动共享API。这样我可以使用.Net Memory Profiler(或者你喜欢的ANTS)以及dotTrace的性能。我可以很容易地选择一些 这样问题。

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

  4. 按照使用的方式应投票给更好的分析者: http://xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler