性能优化-(二)通过读取日志信息查看内存使用情况

前言

满足了产品的功能基本需求,仅仅的是一个开始,后续需要进可能提高应用性能。用户除了使用产品的基本功能外,还期望我们的应用耗电少、启动快、对用户互动响应迅速,希望是一个酷炫而且高效的应用。

下面介绍Android Studio的日志输出信息来查看APP的内存的使用情况。

Dalvik日志消息

在Dalvik中,每个GC都会将以下信息输出到logcat中:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

示例:

    D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

下面描述各个字段的含义:

GC原因(GC_Reason):
什么触发了GC以及是哪种回收。可能的原因包括:

  1. GC_CONCURRENT

在您的堆开始占用内存时释放内存的并发 GC。

  1. GC_FOR_MALLOC

您的堆已满而系统不得不停止您的应用并回收内存时,您的应用尝试分配内存而引起的 GC。

  1. GC_HPROF_DUMP_HEAP

当您请求创建 HPROF 文件来分析堆时发生的 GC。

  1. GC_EXPLICIT

显式 GC,例如当您调用 gc() 时(您应避免调用它,而应信任 GC 会根据需要运行)。

  1. GC_EXTERNAL_ALLOC

这仅适用于 API 级别 10 及更低级别(更新的版本会在 Dalvik 堆中分配任何内存)。外部分配内存的 GC(例如存储在原生内存或 NIO 字节缓冲区中的像素数据)。

释放量(Amount_freed):

从此次 GC 中回收的内存量。

堆统计数据(Heap_stats):

堆的可用空间百分比与(活动对象数量)/(堆总大小)。

外部内存统计数据(External_memory_stats)

API 级别 10 及更低级别的外部分配内存(已分配内存量)/(发生回收的限值)。

暂停时间(Pause_time)

堆越大,暂停时间越长。并发暂停时间显示两个暂停:一个出现在回收开始时,另一个出现在回收快要完成时。
在此类日志消息积聚时,请注意堆统计数据(上面示例中的 3571K/9991K 值)的增大情况。如果此值继续增大,可能会出现内存泄露

ART 日志消息

与Dalvik不同,ART 不会为未明确请求的 GC 记录消息。仅在GC暂停时间超过5毫秒或GC持续时间超过100毫秒时,才会输出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)

示例:

 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 以及是哪种回收。可能的原因包括:

Conrurrent :

不会暂停应用线程的并发 GC。此 GC 在后台线程中运行,而且不会阻止分配。

Alloc:

您的应用在堆已满时尝试分配内存而引起的 GC。在这种情况下,垃圾回收在分配线程中发生。

Explicit:

由应用明确请求的垃圾回收。例如,通过调用gc ()。与 Dalvik 一样,在 ART 中,最佳做法是您信任 GC 并避免请求显式 GC(如果可能)。不建议请求显式 GC,因为它们会阻止分配线程并不必要地浪费 CPU 周期。此外,如果显式 GC 导致其他线程被抢占,则也可能会导致卡顿(应用出现卡顿、抖动或暂停)。

NativeAlloc:

原生分配(例如位图或 RenderScript 分配对象)导致出现原生内存压力,进而引起的回收。

CollectorTransition:

由堆转换引起的回收;这由在运行时变更 GC 策略引起(例如应用在可察觉到暂停的状态之间切换时)。回收器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。
回收器转换仅在以下情况下出现:在 Android 8.0 之前的低内存设备上,应用将进程状态从可察觉到暂停的状态(例如应用在前台运行时,这种情况下,用户可以察觉 GC 暂停)更改为察觉不到暂停的状态(反之亦然)。

HomogeneousSpaceCompact:

同构空间压缩是空闲列表空间到空闲列表空间压缩,通常在应用进入到察觉不到暂停的进程状态时发生。这样做的主要原因是减少内存使用量并对堆进行碎片整理。

DisableMovingGc

这不是真正的 GC 原因,但请注意,由于在发生并发堆压缩时使用了 GetPrimitiveArrayCritical,回收遭到阻止。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical,因为它在移动回收器方面存在限制。

HeapTrim

这不是 GC 原因,但请注意,在堆修剪完成之前,回收会一直受到阻止。

GC名称

ART具有可以运行的多种不同的GC。

Concurrent mark sweep (CMS)

整个堆回收器,会释放和回收除映像空间以外的所有其他空间。

Concurrent partial mark sweep

几乎整个堆回收器,会回收除映像空间和 Zygote 空间以外的所有其他空间。

Concurrent sticky mark sweep

分代回收器,只能释放自上次 GC 后分配的对象。此垃圾回收比完整或部分标记清除运行得更频繁,因为它更快速且暂停时间更短。

Marksweep + semispace

并发、复制 GC,用于堆转换以及同构空间压缩(对堆进行碎片整理)。

Note:

[以上部分内容参考官方推荐的性能优化建议]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值