如何检查 Android 应用的内存使用情况

2025-04-17 12:20:47
推荐回答(1个)
回答1:

最简单的调查应用内存使用情况的地方就是Dalvik日志信息。可以在logcat(输出信息可以在Device Monitor或者IDE中查看到,例如Eclipse和Android Studio)中找到这些日志信息。每次有垃圾回收发生,logcat会打印出带有下面信息的日志消息:

  Java

  1
  D/dalvikvm: , , ,
  GC原因

  触发垃圾回收执行的原因和垃圾回收的类型。原因主要包括:

  GC_CONCURRENT

  并发垃圾回收,当堆开始填满时触发来释放内存。

  GC_FOR_MALLOC

  堆已经满了时应用再去尝试分配内存触发的垃圾回收,这时系统必须暂停应用运行来回收内存。

  GC_HPROF_DUMP_HEAP

  创建HPROF文件来分析应用时触发的垃圾回收。

  GC_EXPLICIT

  显式垃圾回收,例如当调用 gc()(应该避免手动调用而是要让垃圾回收器在需要时主动调用)时会触发。

  GC_EXTERNAL_ALLOC

  这种只会在API 10和更低的版本(新版本内存都只在Dalvik堆中分配)中会有。回收外部分配的内存(例如存储在本地内存或NIO字节缓冲区的像素数据)。

  释放数量

  执行垃圾回收后内存释放的数量。

  堆状态

  空闲的百分比和(活动对象的数量)/(总的堆大小)。

  外部内存状态

  API 10和更低版本中的外部分配的内存(分配的内存大小)/(回收发生时的限制值)。

  暂停时间

  越大的堆的暂停时间就越长。并发回收暂停时间分为两部分:一部分在回收开始时,另一部分在回收将近结束时。

  例如:

  Java

  D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
  随着这些日志消息的增多,注意堆状态(上面例子中的3571K/9991K)的变化。如果值一直增大并且不会减小下来,那么就可能有内存泄露了。