理解Android DDMS Logcat 输出的关于内存的消息

如果你在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_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的原因。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_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完成后释放了多少内存。  

  • 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 


英文原文(需要梯子) 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值