繁体   English   中英

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

[英]How to take heap snapshot of Xamarin.Android's Mono VM?

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

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

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

如何获取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中包含mprof-report

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

我一直在使用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文本输出。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM