GC日志分为两种情况,Dalvik虚拟机下的GC日志和ART虚拟机下的GC日志。

1、Dalvik

Dalvik虚拟机下的GC格式日志如下:

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

引起GC原因

引起GC的原因有以下5种:

  • GC_CONCURRENT:堆快被用完的时候,就会触发这个GC回收内存。
  • GC_FOR_MALLOC:当堆内存已满时,app尝试分配内存而引起的GC,系统必须停止app并回收内存。
  • GC_HPROF_DUMP_HEAP:当你请求创建 HPROF 文件来分析堆内存时出现的GC。
  • GC_EXPLICIT:显示的GC,例如调用System.gc()(应该避免调用显示的GC,信任GC会在需要时运行)。
  • GC_EXTERNAL_ALLOC:仅适用于 API 级别小于等于10 ,用于外部分配内存的GC。

其他信息

  • Amount_freed:本次GC释放内存的大小。
  • Heap_stats:堆的空闲内存百分比 (已用内存)/(堆的总内存)。
  • External_memory_stats:API 级别 10 及更低级别的内存分配 (已分配的内存)/(引起GC的阀值)。
  • Pause time:暂停时间,更大的堆会有更长的暂停时间。并发暂停时间显示了两个暂停:一个出现在垃圾收集开始时,另一个出现在垃圾收集快要完成时。

案例介绍:

D/dalvikvm: GC_FOR_ALLOC freed 4499K, 30% free 14182K/20024K, paused 40ms, total 40ms

这个GC日志的含义为:引起GC的原因是GC_FOR_ALLOC;本次GC释放的内存为4499K;堆的空闲内存百分比为30%,已用内存为14182K,堆的总内存为20024K;暂停的总时长为40ms。

2、ART

ART的GC日志与Dalvik不同,ART 不会为没有明确请求的垃圾收集打印GC日志。只有在认为GC速度慢时才会打印GC日志(仅在GC暂停超过5ms 或GC持续时间超过 100ms 时才会打印GC日志)。如果app未处于可察觉的暂停进程状态,那么它的GC不会被认为是慢速的。ART的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)>

引起GC原因
ART的引起GC原因(GC_Reason)要比Dalvik多一些,有以下几种:

  • Concurrent: 并发GC,不会使App的线程暂停,该GC是在后台线程运行的,并不会阻止内存分配。
  • Alloc:当堆内存已满时,App尝试分配内存而引起的GC,这个GC会发生在正在分配内存的线程。
  • Explicit:App显示的请求垃圾收集,例如调用System.gc()。与Dalvik一样,最佳做法是应该信任GC并避免显示的请求GC,显示的请求GC会阻止分配线程并不必要的浪费 CPU 周期。如果显式的请求GC导致其他线程被抢占,那么有可能会导致 jank(App同一帧画了多次)。
  • NativeAlloc:Native内存分配时,比如为Bitmaps或者RenderScript分配对象, 这会导致Native内存压力,从而触发GC。
  • CollectorTransition:由堆转换引起的回收,这是运行时切换GC而引起的。收集器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。当前,收集器转换仅在以下情况下出现:在内存较小的设备上,App将进程状态从可察觉的暂停状态变更为可察觉的非暂停状态(反之亦然)。
  • HomogeneousSpaceCompact:齐性空间压缩是指空闲列表到压缩的空闲列表空间,通常发生在当App已经移动到可察觉的暂停进程状态。这样做的主要原因是减少了内存使用并对堆内存进行碎片整理。
  • DisableMovingGc:不是真正的触发GC原因,发生并发堆压缩时,由于使用了 GetPrimitiveArrayCritical,收集会被阻塞。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical,因为它在移动收集器方面具有限制。
  • HeapTrim:不是触发GC原因,但是请注意,收集会一直被阻塞,直到堆内存整理完毕。

垃圾收集器名称
GC_Name指的是垃圾收集器名称,有以下几种:

  • Concurrent mark sweep (CMS):CMS收集器是一种以获取最短收集暂停时间为目标收集器,采用了标记-清除算法(Mark-Sweep)实现。 它是完整的堆垃圾收集器,能释放除了Image Space之外的所有的空间。
  • Concurrent partial mark sweep:部分完整的堆垃圾收集器,能释放除了Image Space和Zygote Spaces之外的所有空间。关于Image Space和Zygote Spaces可以查看Android内存优化(一)DVM和ART原理初探这篇文章。
  • Concurrent sticky mark sweep:分代收集器,它只能释放自上次GC以来分配的对象。这个垃圾收集器比一个完整的或部分完整的垃圾收集器扫描的更频繁,因为它更快并且有更短的暂停时间。
  • Marksweep + semispace:非并发的GC,复制GC用于堆转换以及齐性空间压缩(堆碎片整理)。

其他信息

  • Objects freed:本次GC从非Large Object Space中回收的对象的数量。
  • Size_freed:本次GC从非Large Object Space中回收的字节数。
  • Large objects freed: 本次GC从Large Object Space中回收的对象的数量。
  • Large object size freed:本次GC从Large Object Space中回收的字节数。
  • Heap stats:堆的空闲内存百分比 (已用内存)/(堆的总内存)。
  • Pause times:暂停时间,暂停时间与在GC运行时修改的对象引用的数量成比例。目前,ART的CMS收集器仅有一次暂停,它出现GC的结尾附近。移动的垃圾收集器暂停时间会很长,会在大部分垃圾回收期间持续出现。

实例介绍

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日志的含义为:引起GC原因是Explicit ;垃圾收集器为CMS收集器;释放对象的数量为104710个,释放字节数为7MB;释放大对象的数量为21个,释放大对象字节数为416KB;堆的空闲内存百分比为33%,已用内存为25MB,堆的总内存为38MB;GC暂停时长为1.230ms,GC总时长为67.216ms。
————————————————
参考链接:Android内存优化(二)DVM和ART的GC日志分析

Android GC日志相关推荐

  1. linux 输出gc日志,Tomcat输出保存JVM GC日志文件

    当系统出现问题时,分析java虚拟机GC日志可以帮助我们定位问题,一般来说, 我们可以通过制定JVM参数使tomcat保存GC日志文件,具体实现如下: Windows下 找到tomcat的解压目录,进 ...

  2. Android动态日志系统Holmes

    背景 美团点评公司是全球领先的一站式生活服务平台,为6亿多消费者和超过450万优质商户提供连接线上线下的电子商务网络.美团点评的业务覆盖了超过200个丰富品类和2800个城区县网络,在餐饮.外卖.酒店 ...

  3. gc日志一般关注什么_Java架构师必懂的GC日志知识

    在Java,Android,C#等中,GC是自动的,而在几种前代编程语言(C,C ++)中,程序员必须明确编写代码才能释放对象. 所以,这对于Java,Android和C#应用程序开发人员来说是一个很 ...

  4. Android高性能日志模块-Xlog 正篇

    Android高性能日志模块-Xlog 前言 日志可以帮助我们定位问题,记录当前程序的运行状态.与后端开发不同的是,Android中的Log原生支持的仅是本地调试和信息记录,并不能很方便地定位远程问题 ...

  5. android gc由QQ空间团队奉献

    著作权归原作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:MagiLu 链接:http://zhuanlan.zhihu.com/magilu/20282779 来源:知乎 想写 ...

  6. Android GC 简史

    Android 开发者对于 GC 既熟悉又陌生,听说过很多虎狼之词,对一些问题又不置可否:今天聊聊 Android 里的 GC,如果你对于下面的问题有兴趣又没答案,那你应该会有些收获: JVM.Dal ...

  7. Android GC 原理探究

    本文为腾讯 Bugly 公众号投稿,作者:陈昱全,版权归原作者所有,未经作者同意,请勿转载. 原文地址:http://mp.weixin.qq.com/s/CUU3Ml394H_fkabhNNX32Q ...

  8. Java GC 日志详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt105 java GC日志可以通过 +PrintGCDetails开启 以Pa ...

  9. JVM实用参数 GC日志

    为什么80%的码农都做不了架构师?>>>    原文章地址:http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具,它准确记录了每一次 ...

最新文章

  1. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
  2. 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
  3. spring + mybatis
  4. python中的赋值和深浅拷贝
  5. virtualvenv+django+uWSGI+nginx 部署 踩坑记录
  6. bios文件查看工具_何必花钱升级显卡!AMD鸡血BIOS杀到
  7. 用.NET Core实现装饰模式和.NET Core的Stream简介
  8. linux iptables找不到,centos /etc/sysconfig/下找不到iptables文件解决方法
  9. 自然语言处理的几个困难
  10. 设计模式(三):单例模式
  11. 计算机组成原理白中英考点,唐朔飞版和白中英版《计算机组成原理》考研考点精讲及复习思路...
  12. JVM内存模型和性能调优:JVM整体结构及内存模型- 第10篇
  13. 利用继电器实现防抖自锁功能
  14. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  15. C语言指针理解(一)
  16. css3 calc的使用
  17. 山东专升本计算机知识点(中)
  18. [Elasticsearch]4.可伸缩性解密:集群、节点和分片
  19. linux内核熵池,快速的给内核熵池喂随机数
  20. 用google突破图书馆入口IP限制小技巧

热门文章

  1. 用C语言求三个数的最大值与排序
  2. Elasticsearch权限控制
  3. 流失玩家高达500万 DNF“遗孀”成香饽饽
  4. boss直聘实现自动回复以及自动获取简历功能
  5. u检验、t检验、F检验、卡方检验详细分析
  6. matlab exp(),matlab的exp函数
  7. mysql的主从复制和半同步复制的配置
  8. 把Apple ID 账号改成QQ邮箱教程
  9. 数梦工场携手宁波共建创新大数据云基地
  10. WR703n安装openwrt做打印服务器