您的应用程序在用户界面和内存方面的性能非常相关。
在这种情况下,93 毫秒意味着您的设备在理想情况下可能会丢掉大约 6 帧。如果经常执行 GC,这可能是个问题。
Android ART/Dalvik 虚拟机是 Java 虚拟机的一个版本,其中垃圾收集器实现基于代。这意味着您的应用程序进程有一个关联的堆,这些堆由不同的代分隔,一旦一代已满,GC 就会采取行动。您可以将这些代视为存储桶或内存数组。
一旦代满,Android 虚拟机将启动垃圾收集器进程。由于 Android 虚拟机无法在应用程序进程运行时收集和分割您的应用程序堆,因此垃圾收集器事件将在垃圾收集器工作时停止应用程序中的所有线程。这就是如果重复调用应用垃圾收集器,您的应用可能会丢帧的原因。
这里有一个例子:
上周我发现我的应用程序正在泄漏内存。我发现这一点是因为在使用我的应用程序 20 分钟后,我注意到 UI 的执行速度非常慢。关闭/打开活动或滚动 RecyclerView 真的很慢。在使用 http://flowup.io/ 监控我的一些生产用户后,我发现了这一点:
帧时间真的非常高,而每秒帧数非常低。你可以看到一些帧需要大约 2 秒来渲染 :S。
试图找出导致这种糟糕的帧时间/fps 的原因,我发现我遇到了内存问题,如您在此处看到的:
即使在应用丢帧的同时平均内存消耗接近 15MB。
这就是我发现 UI 问题的方式。我的应用程序发生内存泄漏,导致大量垃圾收集器事件,这导致 UI 性能不佳,因为 Android VM 必须停止我的应用程序以收集每一帧的内存。
查看代码,我发现自定义视图中有泄漏,因为我没有取消注册注册到 Android Choreographer 实例中的侦听器。发布修复后,一切都恢复正常:)
如果您的应用由于内存问题而丢帧,您应该查看两个常见错误:
- 查看您的应用程序是否在每秒调用多次的方法内分配对象。例如,在 onDraw 自定义视图方法中创建对象的新实例。
- 查看您的应用是否将实例注册到 Android SDK 但未发布。将侦听器注册到总线事件中也可能发生泄漏。
免责声明:我用来监控我的应用的工具正在开发中。我可以使用此工具,因为我是开发人员之一 :) 如果您想使用此工具,我们将很快发布测试版!您可以加入我们的网站:http://flowup.io/。
如果您想使用不同的工具,您可以使用:traveview、dmtracedump、systrace 或集成到 Android Studio 中的 Andorid 性能监视器。但请记住,此工具将监控您连接的设备,而不是您的其他用户设备或 Android 操作系统安装。