背景:我正在尝试追踪Xamarin.Android应用中的内存泄漏。使用DDMS和Eclipse Memory Profiler,我能够看到哪些对象是活着的。当试图追踪持有它们的东西时(GC Root),我只看到“原生堆栈”(当然)。
如何获取MONO VM的堆快照?所以我以后可以使用ie快照工具吗?
或者是否有任何其他技术可以用来找到Xamarin.Android的.NET部分中存放物体的内容?是否可以在程序中做一些事情?
答案 0 :(得分:12)
如何获取MONO VM的堆快照?所以我以后可以使用ie快照工具吗?
现在可以获得Mono VM的堆快照(使用Xamarin.Android 4.8.2 beta测试;可能适用于之前的版本,您的里程可能会有所不同)。这是一个四步过程:
启用快照记录:
adb shell setprop debug.mono.profile log:heapshot
启动您的应用。 (如果您的应用程序在(1)之前已经运行,请终止并重新启动它。)
使用您的应用。
抓取您应用的个人资料数据:
adb pull /data/data/@PACKAGE_NAME@/files/.__override__/profile.mlpd
@PACKAGE_NAME@
是您的应用程序的包名称,例如如果您的包裹为FooBar.FooBar-Signed.apk
,则@PACKAGE_NAME@
将为FooBar.FooBar
。
分析数据:
mprof-report profile.mlpd
mprof-report
包含在Mono中。
注意:发生GC时,仅{<1>} 更新,因此 想要致电profile.mlpd
在一些&#34;众所周知的&#34;指出要确保GC.Collect()
定期更新。
答案 1 :(得分:4)
我一直在使用Xamarin Android内存分析遇到麻烦,并且使用了一些技巧:
在Dalvik方面,我使用Android Monitor转储堆快照,然后使用JProfiler或Eclipse MAT打开它。这个标准Android。
我的大部分代码都是共享的(70-80%),为了验证这一点,我构建了一个简单的WinForms应用程序来驱动共享API。这样我可以使用.Net Memory Profiler(或者你喜欢的ANTS)以及dotTrace的性能。我可以很容易地选择一些 这样问题。
通过使用上面@jnop解释的解决方案,我可以在Mono的HeapShot工具中打开profile.mldp并获得一个可视化工具,而不是mprof-report文本输出。
按照使用的方式应投票给更好的分析者: http://xamarin.uservoice.com/forums/144858-xamarin-suggestions/suggestions/3229534-add-memory-and-performance-profiler