欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发关于内存抖动的分析和注意事项

程序员文章站 2023-02-20 08:21:04
一,内存抖动 内存抖动:指的是在短时间内大量的新对象被实例化,运行时无法承载这样的内存分配,在这种情况下垃圾回收事件被大量调用,影响到应用程序的ui和整体性能。 二,分析内存抖动 android s...

一,内存抖动

内存抖动:指的是在短时间内大量的新对象被实例化,运行时无法承载这样的内存分配,在这种情况下垃圾回收事件被大量调用,影响到应用程序的ui和整体性能。

二,分析内存抖动

android studio提供了一个 profile的工具,可以帮助我们分析内存情况,在studio的上不有一个表盘的图标

Android开发关于内存抖动的分析和注意事项

点击红框图标,然后就会运行当前项目,选中连接的手机,然后在studio的底部就会出现一个android profile的工具项(如下图)。

Android开发关于内存抖动的分析和注意事项

我们会看到有cpu,memory,network三个选项,我们要监控的是内存,所以点击memory,会进入下图

Android开发关于内存抖动的分析和注意事项

在这张图中我们可以看到我们当前应用所占的内存total,我们这里重点说一下左上角的三个按钮分别是:

gc手动垃圾回收 收集当前页面的内存情况并生成hprof文件 记录当前操作的内存情况

首先我们调用gc是当前内存处于稳定状态,然后点击红色按钮开始记录内存状况,然后我们开始在手机上进行操作(一般这个时候会发现平稳的曲线开始波动),然后我们点击停止按钮,回出现下图的情况。Android开发关于内存抖动的分析和注意事项

框框内是我们当前记录的操作区间,当我们点击停止按钮的时候,

在class name这个框内,会生成当前记录区间(操作过程)的堆信息。

我们发现我们的曲线有一个向上的陡坡,说明我们的操作造成了大量的内存分配,通过下面堆信息我们来找一下是什么造成了大量的内存分配。

Android开发关于内存抖动的分析和注意事项

我们发现堆信息是从大到小排列的,而第一条是的imageview,明显这里有问题,点击进去发现有大量的imageview对象,点击其中的一个,右下角的框框会显示该对象的具体位置信息。至此我们找到了造成内存抖动的罪魁祸首,

当然,这里的内存抖动是我人为加上去的,比较明显,但是原理是一样的。

三,注意事项

1)避免在view.ondraw()中进行内存分配,我们知道每次view重绘的时候该方法都会被调用。如果在该方法内实例化对象,每次会分配大量的内存。而且该方法内的对象一旦不被使用会快会被回收,都会导致一次或者多次垃圾回收,我们知道垃圾回收更加消耗cpu,会导致屏幕绘制时间减少,有可能造成屏幕卡顿。

2)合理的使用对象复用(尤其是bitmap)。就像系统的listview,recyclerview滑动过程中对象复用机制这样。

3)对象池模式对于重用已分配对象非常有帮助,目的在于面对需要大量分配高成本对象时,通过对象重用来尽量减少内存分配以及垃圾回收对系统产生的影响。

4)享元模式,通过节省对象所共享的状态,以减少内存的量(和对象池是有区别的)

kotlin写android项目实战