Android 性能优化 - 彻底解决内存抖动

android profile 效果图如下图

Memory 中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到 上面的一溜白色垃圾桶。说明在大量的执行gc操作。用了一会儿 手机就开始卡了

学习内容

  • android studio 3.0 编译器 查看内存抖动
  • 使用工具来快速定位 引起内存抖动的代码。
  • 学习 到什么样的 错误操作会导致内存都懂,如何避免。

快速定位内存抖动

快速定位 还得使用ddms。莫慌 as里面自带了 Tools->Android->Android Device Monitor 然后进行如下操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们看如下图片。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不要慌。

中间红框的就是我们要分析的内容,看他参差不齐的就是 内存抖动造成的。

然后我们把红框 内容放大。鼠标点住 然后往右拖动,就会变大,点击 红框上面的数字就会变小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将 抖动的地方 放大后。随便点击会出现下图样式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到这个粉色的拱门的 图案。从它的左边到右边 代表 一个函数 消耗的时间。

我们接下来 就快速定位有问题的代码在哪里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我就随便的滑动了一下,然后 随便的选中了一个, 然后下边就展示了 我所选中的 函数方法。

这里有一个细节

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • onClick 最前面 的序号是 9
  • Parent 下的方法 序号为8
  • children 下的方法序号为10

说明 onClick 的序号 大于onClick 调用的方法 的序号。小于 onClick 被调用的方法的序号。

如果我们一直点击Parent 下的方法就会找到 序号为1 的方法

如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们找到了错误代码在哪。那么我们就看一下 源代码的样子

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imPrettySureSortingIsFree();

}
});
}

/**

  •  排序后打印二维数组,一行行打印
    */
    public void imPrettySureSortingIsFree() {
    int dimension = 300;
    int[][] lotsOfInts = new int[dimension][dimension];
    Random randomGenerator = new Random();
    for (int i = 0; i < lotsOfInts.length; i++) {
    for (int j = 0; j < lotsOfInts[i].length; j++) {
    lotsOfInts[i][j] = randomGenerator.nextInt();
    }
    }

for (int i = 0; i < lotsOfInts.length; i++) {
String rowAsStr = “”;
//排序
int[] sorted = getSorted(lotsOfInts[i]);
//拼接打印
for (int j = 0; j < lotsOfInts[i].length; j++) {
rowAsStr += sorted[j];
if (j < (lotsOfInts[i].length - 1)) {
rowAsStr += ", ";
}
}
}

}

public int[] getSorted(int[] input) {
int[] clone = input.clone();
Arrays.sort(clone);
return clone;
}

}

发现 rowAsStr 对象在被不断地创建。 我们可以把它优化一下

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
imPrettySureSortingIsFree();

}
});
}

/**

  •  排序后打印二维数组,一行行打印
    */
    public void imPrettySureSortingIsFree() {
    int dimension = 300;
    int[][] lotsOfInts = new int[dimension][dimension];
    Random randomGenerator = new Random();
    for (int i = 0; i < lotsOfInts.length; i++) {
    for (int j = 0; j < lotsOfInts[i].length; j++) {
    lotsOfInts[i][j] = randomGenerator.nextInt();
    }
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

你不踏出去一步,永远不知道自己潜力有多大,千万别被这个社会套在我们身上的枷锁给捆住了,30岁我不怕,35岁我一样不怕,去做自己想做的事,为自己拼一把吧!不试试怎么知道你不行呢?

改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

droid源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)**

[外链图片转存中…(img-e7OX5zkT-1712159500240)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值