【问题标题】:android performance issue安卓性能问题
【发布时间】:2010-11-02 09:51:08
【问题描述】:

我的 android 应用程序运行良好,但它的性能(速度)很慢。在我的 logcat 中,我看到了频繁的垃圾收集操作,例如

11-02 15:07:20.647: DEBUG/dalvikvm(12571): GC 在 93 毫秒内释放了 295 个对象 / 38448 个字节

这是性能低下的原因吗?我怎样才能提高我的应用程序性能??? 有人请帮忙

【问题讨论】:

  • 在不了解您的应用的情况下很难说。你使用很多图像吗?直播?什么样的应用程序?
  • 频繁的垃圾收集表明潜在的内存泄漏。

标签: android


【解决方案1】:

如果您使用模拟器,请不要担心 - 它本身很慢。我认为 GC 对此不负责任,93 毫秒是你甚至不会注意到的时间。因此,请在真机上尝试您的应用程序,如果存在性能问题 - 请使用分析器。

【讨论】:

  • @vladmir 我试过用真手机。我发生了同样的情况...@Mathias 我的应用程序是从服务器下载图像,显示它们,当用户触摸该图像时,会根据触摸位置进行一些背景计算
  • 从 developer.android.com 网站,我看到性能低下的原因之一是在用户界面循环中分配对象。我在我的活动的 OnCreate() 方法中分配了大部分。 UI 循环中的 Oncreate() 是否存在?
  • @asifkt,后台应用程序呢? loww 性能何时发生?
  • 整体性能较低。背景操作是将触摸位置与位置数组进行比较。我认为我在那里使用的逻辑没有错误。我使用的代码与我朋友在他的 j2me 应用程序中使用的代码相同。效果很好
  • onCreate 在首次构建活动时调用。您是否在 onCreate() 中为图像分配内存?请出示代码。
【解决方案2】:

您的应用程序在用户界面和内存方面的性能非常相关。

在这种情况下,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 操作系统安装。

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 2013-08-21
    • 2012-05-07
    • 2018-07-03
    • 2014-02-19
    • 2011-06-12
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多