Android性能优化:使用Profiler进行内存优化

在App开发过程中,可能会有小伙伴在Logcat中看到过这个信息:

Background concurrent copying GC freed 282965(11MB) AllocSpace objects, 
39(7MB) LOS objects, 42% free, 23MB/41MB, paused 248us total 207.041ms

这条信息表明,Java的垃圾回收机制,帮我们进行了垃圾回收。释放了11M内存,28万多个对象。一段时间内,app内部创建了大量对象。接下来我们借助Profiler,定位到这个问题。

首先进行场景还原。
创建一个Activity,Activity中只有一个Button,点击Button会创建大量的对象。

/**
 * button点击事件
 * @param view
 */
public void allocate(View view) {
        int sum = 20*1000;
        for (int i = 0; i < sum; i++) {
            new ByteArr();
        }

}

class ByteArr{
    private byte[] b;
    public ByteArr() {
        b = new byte[40];
        for (int i = 0; i < b.length; i++) {
            b[i] = (byte) (i/126);
        }
    }
}

点击一次Button,创建20万个ByteArr对象,每个ByteArr对象至少40个字节。

然后我们运行App,打开profiler,选择我们运行的进程。
在这里插入图片描述
接着点击Memory。
在这里插入图片描述
这里有两个选项:第一个,记录特定时间点,内存的试用情况;第二个,查看一段时间内,Java或者kotlin对象的创建情况。这里我们用到的是第二个选项,无法看到第二选项的小伙伴,尝试升级下android studio;
在这里插入图片描述
当我们点击Record后,就可以开始不断点击Button,大量创建对象了。我们盯着顶部的memory,当出现垃圾桶图标,表示已经进行了垃圾回收,点击上方的红色圆点,停止记录。
在这里插入图片描述
为了方便查看,选择按照package分类
在这里插入图片描述
关注Allocations那一列,可以看到,在我们点击Button的这段时间内,创建了21188个ByteArr。
在这里插入图片描述
点击Table旁边的Visualization,Profiler会用图形的方式展现,这个过程会造成界面IDE界面卡顿,需要耐心等待一下。
在这里插入图片描述
选择Allcation Count。
在这里插入图片描述

这里不仅展示了对象的创建数量,还贴心的描述了创建路径。
在这里插入图片描述
比如上图的第一列,可以很方便的定位到源代码位置。
在这里插入图片描述
将指针悬浮在一个方法上,profiler会告诉我们这个方法执行过程中,创建了多少个对象。
在这里插入图片描述
切换到Allocation Size,查看创建对象的分配内存。
在这里插入图片描述
在这里插入图片描述
指针悬浮在方法上时,显示方法执行后,消耗了多少内存。
在这里插入图片描述
工欲善其事必先利其器,掌握了内存分析,写出高质量的App,指日可待。

频繁gc,可能是写代码时的疏忽导致了。但是无法避免频繁创建对象怎么办?推荐去阅读Handler源码,重点查看Message类的obtain()和recycle()。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值