Dalvik与ART虚拟机的GC调试日志分析

本文主要讲述Dalvik与ART两种Android虚拟机,在GC时产生log信息的含义,便于分析。


一、Dalvik

1.1 GC含义

Dalvik虚拟机,每一次GC打印内容格式:

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

对应项:
D/dalvikvm: <GC触发原因> <GC释放内存大小>, 
<堆统计信息>, <外部内存统计>, <暂停时间>

含义解析

GC Reason(GC触发原因)
GC_CONCURRENT:当已分配内存达到某一值时,触发并发GC;
GC_FOR_MALLOC:当尝试在堆上分配内存不足时触发的GC;系统必须停止应用程序并回收内存;
GC_HPROF_DUMP_HEAP: 当需要创建HPROF文件来分析堆内存时触发的GC;
GC_EXPLICIT:当明确的调用GC时,例如调用System.gc()等;
GC_EXTERNAL_ALLOC: 仅在API级别为10或者更低时(新版本分配内存都在Dalvik堆上)
Amount freed GC回收的内存大小

Heap stats 堆上的空闲内存百分比 (已用内存)/(堆上总内存)

External memory stats API级别为10或者更低:(已分配的内存量)/ (即将发生垃圾的极限)

Pause time(暂停时间) 较大的堆将有较大的暂停时间。并发暂停时间显示有两个停顿:一个是垃圾回收的开头和另一接近垃圾回收的结尾。

1.2 实例

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

含义:

GC触发原因:GC_CONCURRENT;
GC释放内存大小:2049K;
堆统计信息:堆空闲内存为65%,已用内存:3571K, 堆上总内存:9991K;
暂停时间:总共暂时4ms。

1.3 小结

根据不断增加的日志信息,观察增加的堆统计信息(在上例中的3571K/9991K值),若该值持续增加,可能有内存泄漏。

二、ART

ART的log不同于Dalvik的log机制,正常情况不会打印非明确调用的GCs的log信息。GCs打印出来的log信息都是被认为是执行比较缓慢的信息,更准确地说,就是GC暂停的时间超过5ms或者GC执行的总时间超过100ms。 如果app不处于暂停的感知状态,那么没有GC会被认为是缓慢的。但是明确地调用GCs会记录log信息。

2.1 GC含义

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)>

对应项:
I/art: <GC触发原因> <GC名称>   <释放对象个数>(<释放字节数>)    AllocSpace Objects, 
<释放大对象个数>(<释放大对象字节数>)  <堆统计> LOS objects, <暂停时间>

2.2 GC解析

2.2.1 GC Reason

  1. Concurrent: 并发GC,不会使app线程挂起,该GC是在后台线程运行的,也不会阻止内存分配。
  2. Alloc:当堆内存已满时,app尝试申请内存,会触发该GC。在这种情况下,垃圾回收发生在正在分配内存的线程。
  3. Explicit: 明确的调用垃圾回收,比如gc().与dalvik一样,应尽可能避免明确调用gc。不建议使用,由于程序的GC会阻塞分配线程和不必要的CPU周期,如果其他线程获取抢占资源也可能导致jank。
  4. NativeAlloc: 垃圾回收是由于native内存过重而触发的,例如Bitmaps或者RenderScript分配的对象。
  5. CollectorTransition: 由于堆过渡触发的。收集器转换包括拷贝所有的对象从一个自由列表支持空间到指针空间,也包括反过来拷贝。目前垃圾回收器传输仅发生在低内存设备的app进程状态转移,包含从一个可感知的暂停状态转换到非暂停可感知状态,或者非暂停态到暂停态。
  6. HomogeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当app已经移动到暂停可感知的进程状态。这样做的主要原因是减少了内存使用情况和堆碎片整理
  7. DisableMovingGc:这并非真实的GC触发原因,只是标记垃圾回收被阻塞,由于并非堆压缩正在发生时使用了GetPrimitiveArrayCritical。由于其对移动收集器的限制,使用GetPrimitiveArrayCritical是强烈不建议
  8. HeapTrim: 这并非GC触发原因,只是标记垃圾回收被阻塞直到堆整理完成。

2.2.2 GC Name

  1. Concurrent mark sweep (CMS): 完整的堆垃圾回收器,能释放除去图片空间之外的所有的垃圾。
  2. Concurrent partial mark sweep: 绝大多数的堆垃圾回收器,能释放除去图片和zygote空间之外的所有的垃圾。
  3. Concurrent sticky mark sweep: 一般性的垃圾回收器,只能释放上一次GC所关联的对象。该垃圾回收器运行得更常用,有更低的暂停时间
  4. Marksweep + semispace: 非并发gc,复制GC用于堆过渡以及齐性空间压缩(堆碎片整理)。

2.2.3 GC其他参数

  • Objects_freed: 从非大对象空间回收到的对象数;
  • Size_freed:从非大对象空间回收到的字节数;
  • Large_objects_freed:从大对象空间回收到的对象数;
  • Large_object_size_freed:从大对象空间回收到的字节数;
  • Heap_stats: 堆上的空闲内存百分比 (已用内存)/(堆上总内存);
  • Pause_time:暂停时间跟GC正在运行时引用对象被改变的对象数成正比。目前,ART的CMD GC仅有一次停顿,出现在GC的结尾附近。移动GC有一个长的暂停时间持续在GC的大多数期间。

2.3 实例

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects, 21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms

含义:

  • GC触发原因:Explicit
  • GC名称:concurrent mark sweep GC
  • 释放对象个数:104710
  • 释放字节数:7MB
  • 释放大对象个数:21
  • 释放大对象字节数:416KB
  • 堆统计:堆空闲内存为33%,已用内存:25MB, 总内存总:38MB
  • 暂停时间:GC暂停时长:1.230ms,GC总时长:67.216ms

2.4 小结

  • 当看到大量的GC log信息在logcat,可查看堆统计(如样例中 5MB/38MB)。如果这个值持续增长,并且一直不见它变小,那可能发生了内存泄露。
  • 如果看到GC触发条件是Alloc,那当前环境已经接近堆内存的上限了,在不久后很快会出现OOM。

参考http://developer.android.com/tools/debugging/debugging-memory.html

参考Dalvik与ART虚拟机的GC调试日志

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353