如果你在IDE中运行过你的Android应用程序,在IDE的LogCat窗口,你会看到如下内容,这些内容代表着什么, 这些内容能告诉你什么?
GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
GC_CONCURRENT freed 379K, 42% free 3856K/6535K, external 0K/0K, paused 2ms+3ms
GC_EXPLICIT freed 144K, 41% free 3898K/6535K, external 0K/0K, paused 32ms
GC_CONCURRENT freed 334K, 40% free 4091K/6727K, external 0K/0K, paused 2ms+3ms
这些信息是Android GC(垃圾回收)处理的Log。每次GC被触发,都会在LogCat窗口中展示类似上面的信息。它能告诉你许多事,还可以给你有关内存泄漏的一些线索。下面,我们就来详细的介绍它们的含意。
- Reason
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
第一部分告诉你GC的原因。Android中有5种类型的GC。
- GC_CONCURRENT:当堆增长的时候触发。它可以及时的回收内存,因此堆不需要申请更大的空间。
- GC_EXPLICIT: 当app调用System.gc()的时候触发。这个函数应该永远不被使用,因为Android系统内的虚拟机有足够的能力去处理GC。
- GC_EXTERNAL_MALLOC: 用来申请外部分配的空间,如bitmaps和NIO的bytebuffers。它只会发生在Honeycomb版本之前,因为从Honeycomb版本开始,外部空间在dalivk堆中分配。
- GC_FOR_MALLOC:当app需要更多的内存且堆已满的时候触发。为了执行GC将会停止你的app。
- GC_HPROF_DUMP_HEAP:当一个HPROF文件被创建的时候触发。HPROF文件的作用是进行内存分析。
- Result
GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
这部分告诉你这次GC完成后释放了多少内存。
- Heap Statistics
GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
这部分告诉你堆还有百分之几空余,未被回收的对象的大小和堆的总大小。在上面的例子中,堆还有41%的剩余,3673K内存被使用,以及堆总大小为6151K
- External Memory Statistics
GC_EXTERNAL_ALLOC freed 1125K, 47% free 6310K/11847K, external 1051K/1103K, paused 46ms
GC_EXTERNAL_ALLOC freed 295K, 47% free 6335K/11847K, external 1613K/1651K, paused 41ms
这一部分告诉你有关外部分配空间的信息。在Honeycomb之前的版本,bitmaps存在这个区域。
上面两行大概触发的GC导致了100ms的间隔。第一行,你可以清楚的看到外部空间几乎满了。所以GC_EXTERNAL_ALLOC 被触发,外部空间增大到1651k。
(注:外部空间不是SD卡的空间)
- GC Pause Time
GC_CONCURRENT freed 178K, 41% free 3673K/6151K, external 0K/0K, paused 2ms+2ms GC_EXPLICIT freed 6K, 41% free 3667K/6151K, external 0K/0K, paused 29ms
log的最后一部分告诉你这次GC使用了多长时间。在 GC_CONCURRENT 回收中你将看到两个时间。一个是开始回收的时间,另一个是结束的时间。并行回收通常时间都很短,相对来说其他的回收使用的时间都比它长。
造成 GC_CONCURRENT 的原因很小因为这个GC在一个分离的线程进行,所以它不会干扰你的app。这些时间通常都小于5ms
如果你想观看有关这个的视频,请自备梯子到youtube上 Google I/O 2011: Memory management for Android Apps
英文原文(需要梯子) 点击打开链接