在这里记录下编程开发的各种小技巧,帮助他人,成长自己。

  • ART 日志消息格式

    ​ART 不会为未明确请求的垃圾回收记录消息。只有在认为垃圾回收速度较慢时才会打印垃圾回收(垃圾回收暂停时间超过 5ms 或垃圾回收持续时间超过 100ms)

    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)>

    示例:

    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_Reason>:

    • Concurrent:不会暂停应用线程的并发垃圾回收。此垃圾回收在后台线程中运行,而且不会阻止分配。
    • Alloc:应用在堆已满时尝试分配内存引起的垃圾回收
    • Explicit:由应用明确请求的垃圾回收(会阻止分配线程并浪费不必要地 CPU 周期)​
    • NativeAlloc:原生分配(如位图或 RenderScript 分配对象)导致出现原生内存压力,进而引起的回收
    • CollectorTransition:由堆转换引起的回收;此回收由运行时切换垃圾回收引起。回收器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。当前,回收器转换仅在以下情况下出现:在 RAM 较小的设备上,应用将进程状态从可察觉的暂停状态变更为可察觉的非暂停状态(反之亦然)
    • HomogeneousSpaceCompact:齐性空间压缩是空闲列表空间到空闲列表空间压缩,通常在应用进入到可察觉的暂停进程状态时发生。这样做的主要原因是减少 RAM 使用量并对堆进行碎片整理
    • DisableMovingGc: 这不是真正的垃圾回收原因,但请注意,发生并发堆压缩时,由于使用了 GetPrimitiveArrayCritical,回收遭到阻止。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical,因为它在移动回收器方面具有限制。
    • HeapTrim:这不是垃圾回收原因,但请注意,堆修剪完成之前回收会一直受到阻止

    <GC_Name>:

    • Concurrent mark sweep (CMS)​:整个堆回收器,会释放和回收映像空间以外的所有其他空间
    • Concurrent partial mark sweep:几乎整个堆回收器,会回收除了映像空间和 zygote 空间以外的所有其他空间
    • Concurrent sticky mark sweep:生成回收器,只能释放自上次垃圾回收以来分配的对象。此垃圾回收比完整或部分标记清除运行得更频繁,因为它更快速且暂停时间更短
    • Marksweep + semispace:非并发、复制垃圾回收,用于堆转换以及齐性空间压缩(对堆进行碎片整理)

    <Objects_freed>(<Size_freed>):

    ​此次垃圾回收从非大型对象空间回收的对象数量与大小

    <Large_objects_freed>(<Large_object_size_freed>):

    ​此次垃圾回收从大型对象空间回收的对象数量与大小

    <Heap_stats>:

    ​空闲百分比与(活动对象数量)/(堆总大小)

    ​<Pause_time(s)>:

    ​通常情况下,暂停时间与垃圾回收运行时修改的对象引用数量成正比。当前,ART CMS 垃圾回收仅在垃圾回收即将完成时暂停一次。移动的垃圾回收暂停时间较长,会在大部分垃圾回收期间持续出现

      Android