一.内存的概念
1.手机运行内存(RAM)就相当于我们电脑的内存,是手机中作为APP运行过程中临时性数据暂时存储的内存介质。
Android手机在出厂,虚拟机对单个应用可使用的最大内存做了限制,当你的应用使用内存超过这个限制就会产生OOM。
2.Java内存分配区:
(1)静态存储区
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,主要存放静态数据、全局数据和常量。
(2)栈内存区
为编译器自动分配和释放,主要存放如函数参数、局部变量、临时变量、基本数据类型、句柄等。
(3)堆内存区
为成员分配和释放,有程序员自己申请和释放,如new出来的对象。
二..内存使用不当所产生的问题:
1.崩溃
主要就是我们经常遇到的内存不足时产生的OOM
2.卡顿
内存不足会导致频繁GC,从而造成卡顿;物理内存不足时系统会触发low memory killer机制,系统负载过高时造成卡顿的另外一个原因。
二.内存优化从哪些方面入手?
1.内存泄漏
内存泄漏就是不再使用的内存,没有被回收,这样就导致了内存的浪费。
a.框架设计不合理造成的内存泄漏
b.单例造成的内存泄漏
c.非静态内部类造成的内存泄漏
d.资源未关闭造成的内存泄漏
2.减少内存申请
a.避免创建不必要的对象
例如:当需要频繁操作一个字符串时,使用StringBuffer代替String
b.不要在for循环的第二个条件调用方法
如:for(int i = 0;i < array.size();i++),应该写成
int count = array.size() for(int i = 0;i < count;i++))
3.布局优化
a.减少布局层级
b.纯色背景使用颜色代替图片
c.合理使用merge、viewstup等。
4. Bitmap优化
a.整体的控制,如低端手机使用565格式、使用Glide、Fresco框架。
b.合理的使用图片,如当图片的长宽远远大于view的长宽时,就要换图片。
c.相同图片的重复使用。
5.设备分级
针对低端设备关闭耗内存的复杂动画或者一些功能。
6.缓存管理
有时为了快速的展示数据,我们会把一些数据缓存在内存中,当一个大型的APP存在很多模块时,就可能会缓存很多不同的数据,这时候我们就需要有一个统一的缓存管理,这样当内存使用过高时可以及时释放内存中的缓存。
7.进程管理
一个空的进程也会占用10M的内存,有些APP会有好几个进程,所以合理的使用进程,减少常驻进程也是内存优化的关键。
8.安装包的大小
安装包的大小也会影响内存的使用。
9.数据相关优化
慎用Shareprefercance,因为同一个SP会将整个XML存入内存,有时候为了读一个文件就要将整个XML存入内存,如使用到数据库,数据库字段尽量精简
四.内存使用分析?
内存分析对于解决内存问题是至关重要的,通过内存分析可以清楚的知道哪些地方使用内存不当,从而有针对性的进行完善。
1.使用AndroidStudio3.0新增的profile分析内存使用情况(profile具体使用这里不做介绍,会有专门的章节做介绍)。
2.使用LeakCanary检查内存泄漏。
LeakCanary使用介绍:
(1)在app build.gradle 中加入引用:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}
(2)在Application的oncreate方法中加入:
if (LeakCanary.isInAnalyzerProcess(this)) {//1
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
这样我们就可以使用LeakCanary了,当有某个Activity内存泄漏时就会发出通知提示: