Android开发Android技术知识Android开发

Android GC日志该如何查看

2018-04-07  本文已影响664人  姜康

GC日志分为两种情况,一种是在Dalvik虚拟机下的GC日志,一种是ART虚拟机下的GC日志。

Dalvik

Dalvik虚拟机下的GC格式如下:

D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

尖括号中的依次为:

  1. 垃圾回收原因;
  2. 此次GC释放的内存量;
  3. 堆统计数据:堆的可用空间百分比与(活动对象数量)/(堆总大小);
  4. 外部内存统计数据:API10及以下等级的外部分配内存(已分配内存量)/发生回收的限值);
  5. 暂停时间:堆越大,暂停时间越长。并发暂停时间显示了两个暂停:一个出现在回收开始时,另一个出现在回收快要完成时。

Dalvik GC原因有以下这些

举个例子:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

在 Dalvik(而不是 ART)中,每次垃圾回收都会将以下信息打印到 logcat 中

在这些日志消息积聚时,要注意堆统计数据的增大(上面例子中的 3571K/9991K 值)。如果此值继续增大(或可用空间持续减小),可能会出现内存泄漏。

ART

与Dalvik虚拟机不同的是,ART虚拟机并不会为没有明确请求的GC记录消息。那么什么时候记录呢?

只有在认为垃圾回收速度较慢时才会打印垃圾回收日志(仅在垃圾回收暂停时间超过 5ms 或垃圾回收持续时间超过 100ms 时),如果应用未处于可察觉的暂停进程状态,那么其垃圾回收不会被视为较慢。

始终会记录显式垃圾回收

ART的 GC日志格式:

I/art: <GC_Reason> <GC_Name> <Objects_freed>(<Size_freed>) AllocSpace Objects, <Large_objects_freed>(<Large_object_size_freed>) <Heap_stats> LOS objects, <Pause_time(s)>

其中依次表示为:

  1. 垃圾回收原因
  2. 垃圾回收名称
  3. 释放的对象:此次GC从非大型对象空间回收的对象数量;
  4. 释放的大小:此次GC从非大型对象空间回收的字节数量;
  5. 释放的大型对象:此次GC收从大型对象空间回收的对象数量;
  6. 释放的大型对象大小:此次GC从大型对象空间回收的字节数量;
  7. 堆统计数据:空闲百分比与(活动对象数量)/(堆总大小)
  8. 暂停时间:常情况下,暂停时间与垃圾回收运行时修改的对象引用数量成正比。当前,ART CMS(Concurrent mark sweep) 垃圾回收仅在垃圾回收即将完成时暂停一次。移动的垃圾回收暂停时间较长,会在大部分垃圾回收期间持续出现。

其中GC的原因以及名称都有多种:

ART GC 原因有以下这些:

ART GC 名称有以下这些:

上一篇 下一篇

猜你喜欢

热点阅读