最近在研究Android内存垃圾回收的内容,遇到一些自己之前不知道的技巧和方法。现在分享一种简单的在Logcat中可以看到垃圾回收状态的方法。经常关注Logcat日志的童鞋偶尔会看到一条类似于以下形式的记录。这种记录就是系统执行垃圾回收后返回的状态信息。
Dalvik虚拟机的Log信息
在Davlik虚拟机(非ART)中,每一次垃圾回收都会返回一条类似的信息。例子如下:
D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms
它们大致可以分成如下几个部分:
D/dalvikvm: , , ,
各个字段的含义如下:
GC的原因,也就是GC类别。它包含以下几种类别:
GC_CONCURRENT 当堆将要被填满的时候触发的垃圾回收
GC_FOR_MALLOC 当应用的堆已经被填满的时候,如果应用继续申请内存就会触发此类垃圾回收。系统会杀死应用的进程并且回收所有内存。
GC_HPROF_DUMP_HEAP 当请求生成HPROF文件来分析内存的时候会触发此类垃圾回收
GC_EXPLICIT 一次指定的垃圾回收,例如主动调用System.gc()的时候。(尽量避免此类调用,垃圾回收交给系统来做就可以了)
GC_EXTERNAL_ALLOC 在API版本10(Android3.0)以下的时候的垃圾回收机制。3.0以上版本所有的内存都在Dalvik堆中分配。它是用来回收dalvik虚拟机以外的内存(例如Bitmap中的内存或者NIO buffer中的内存)。
本次垃圾回收中释放的内存总量
堆中可用空间所占的百分比 和 (堆中对象的数量)/(堆的大小)