android内存回收打印解析

Dalvik Log信息

Dalvik(不是ART)模式下,每次FC会在logcat输出如下信息:

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

一、GC_Reason触发垃圾回收的回收的集中原因:

类型

描述

GC_CONCURRENT

堆内存使用将满时,并发的进行垃圾回收。

GC_FOR_MALLOC

当堆内存已满应用尝试分配内存时会出触发垃圾回收,所以系统会停止应用进行垃圾整理

GC_HPROF_DUMP_HEAP

请求创建一个用来分析heapHPROF文件,当创建HPROF文件分析内存时触发垃圾收集。

GC_EXPLICIT

显示的垃圾收集,例如当你调用gc()(应该避免调用,而是交由系统处理)

GC_EXTERNAL_ALLOC

外部内存分配,只会在API10以下版本触发。新版都只会在DalvikHeap上分配。

Amount_freed:本次回收的内存大小
Heap_stats  :heap中可用内存所占百分比,以及[已使用内存大小]/[heap总大小]
External_memory_stats:外部内存统计数据(API10和更低版本中,外部分配的内存)
Pause_time  GC时暂停的时间
注:当回收原因为GC_CONCURRENT时,此时停顿包含两部分,第一次标记root集合停顿的时间,第二次标记集合停顿时间,其他回收的方式都只有一次停顿时间。

ART Log信息

Dalvik不同,ART不会log非显式(隐式)请求的GCGC只会在被判定为很慢时输出信息。更准确地,条件是GC停顿超过5ms,或者GC耗时超过100ms。如果app不是处于一种可察觉的停顿状态,那么GC不会就被判定为很慢,而显式GC会被log出来。

ART Log格式如下:

I/art: <GC_Reason><GC_Name> <Objects_freed>(<Size_freed>) AllocSpaceObjects, <Large_objects_freed>(<Large_object_size_freed>)
<Heap_stats> LOS objects, <Pause_time(s)>
GC_Reason
Concurrent:并发GC,不会挂起app线程,这种GC在后台线程中运行,不会阻止内存分配。
Alloc    : 当堆已经满时,此时应用尝试去分配堆内存,此时会触发GC动作。
Explicit GC动作被应用主动调用,例如,调用gc()gc().,在ART中,尽量避免使用主动调用GC的方式,因为主动调用GC会阻塞内存分配线程和消耗不必要的cpu时间,如果GC导致其它线程被抢占的话,显式GC还会引发jank
注:jank是指第n帧绘制过后,本该绘制第n+1帧,但因为CPU被抢占,数据没有准备好,只好再显示一次第n帧,下一次绘制时显示第n+1帧。
 
NativeAlloc来自native分配的nativememory压力引起的GC,比如Bitmap或者RenderScript对象。
CollectorTransition:在运行时开关GC会导致heap转换,从而导致收集的动作。收集器转换由拷贝所有对象从一个free-listbacked空间到一个bump
pointer空间(或者相反),当前收集器转换仅发生在当一个应用改变进程状态(从可见的暂停到一个可见的非暂停状态(或者相反)在低ram设备中)时。
HomogeneousSpaceCompact:Homogeneousspace compactionfree-listspacefree-listspace的合并,经常在app变成不可察觉的停顿态时发生,这样做的主要原因是减少RAM占用并整理heap碎片
DisableMovingGc不是一个真正的GC原因,正在整理碎片的GCGetPrimitiveArrayCritical阻塞,一般来说,因为GetPrimitiveArrayCritical会限制垃圾回收器过渡,强烈建议不要使用
HeapTrim不是一个真正的GC原因,但GC被阻塞,直到heaptrim结束
 
GC Name
 
Concurrent mark sweep(CMS)
全堆垃圾收集器,负责收集释放除image外的所有空间
Concurrent partial mark sweep
几乎全堆垃圾收集除了imagezygote外的所有堆
Concurrent sticky mark sweep
只负责释放从上次GC到现在分配的对象,该GC比全堆和部分标记清除(mark sweep)执行得更频繁,因为它更快而且停顿更短
Marksweep + semispace 非并发的,复制堆转换和homogeneous space compaction(用来整理heap碎片)。
 
Objects_freed
本次GC从非大对象空间(non large object space)回收的对象数目
 
Size_freed
本次GC从非大对象空间回收的字节数
 
Large_objects_freed
本次GC从大对象空间里回收的对象数目
 
注:
ART还引入了一个特殊的超大对象存储空间(large
object
spaceLOS),这个空间与堆空间是分开的,不过仍然驻留在应用程序内存空间中。这一特殊的设计是为了让ART可以更好的管理较大的对象,比如位图
对象(bitmaps)。在对堆空间分段时,这种较大的对象会带来一些问题。比如,在分配一个此类对象时,相比其他普通对象,会导致垃圾收集器启动的次数
增加很多。有了这个超大对象存储空间的支持,垃圾收集器因堆空间分段而引发调用次数将会大大降低,这样垃圾收集器就能做更加合理的内存分配,从而降低运行
时开销。
 
Large_object_size_freed
本次GC从大对象空间里回收的字节数。
 
Heap_stats
可用空间所占的百分比和[已使用内存大小]/[heap总大小]
 
Pause_time(s)
一般情况下,GC运行时,停顿次数和被修改的对象引用数成比例。目前,ART
CMS GC只会在GC结束的时停顿一次,GC过渡会有一个长停顿,是GC时耗的主要因素
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值