为什么要进行内存优化?

1.App运行内存限制,OOM导致App崩溃

2.App性能:流畅性、响应速度和用户体验

Android的内存管理方式

Android系统内存分配与回收方式

●   一个App通常就是一个进程对应一个虚拟机

可以通过下面的命令在终端来查看Android系统进程和内存分配

adb shell:进入Android底层Linux系统命令

ps: 查看系统进行的命令

dumpsys meminfo 进程名:查看内存分配

●   GC只在Heap剩余空间不够时才会触发垃圾回收机制

App内存限制机制

●   每个App分配的最大内存限制,岁不同设备而不同

●   吃内存大户:图片

切换应用时后台清理机制

●   App切换时采用的是LRU Cache算法

LRU算法:最近使用的排在最前面,最少可能被清理掉

●    onTrimMemory()回调方法

当系统的内存有变化的时候,会发出这个回调方法给各个应用,当应用收到这个回调时,释放内存。

监控内存的几种方法

方法1:通过代码查看

Android App性能优化之内存优化_App

方法2:Android Studio的自带工具Android Monitor来查看App整体内存变化

Android App性能优化之内存优化_Android 内存优化_02

方法3:Android Studio Tools → Android → Android Device Monitor启动设备监控

Android App性能优化之内存优化_Android_03

Android App内存优化方法

数据结构优化

1.频繁字符串拼接用StringBuilder

2.ArrayMap、SparseArry替换HashMap,内存使用更少,效率更高

3.内存抖动

内存抖动是指在短时间内有大量的对象被创建或者被回收的现象。内存抖动出现原因主要是频繁在循环里创建对象,导致大量对象在短时间内被创建,由于新对象是要占用内存空间的,如果一次或者两次在循环里创建对象对内存影响不大,不会造成严重内存抖动,这样可是以接受也是不可避免的,如果是频繁创建对象的话,内存抖动就会很频繁,频繁的内存抖动,会导致垃圾回收机制频繁运行(短时间内产生大量对象,需要大量内存,而且还是频繁抖动,就可能会需要回收内存以用于产生对象,垃圾回收机制就自然会频繁运行了)。

4.再小的Class也会耗费0.5KB

对象复用

1.复用系统自带的资源

2.ListView/GridView的ConvertView复用

3.避免在onDraw方法里面执行对象的创建

避免内存泄漏

1.内存泄漏会导致剩余可用Heap越来越少,频繁触发GC

2.尤其Activity泄漏

3.用Application Context而不是Activity Context

4.注意Cursor对象是否及时关闭

OOM问题优化

OOM问题分析

OOM的绝大部分都是跟图片相关的

强引用、软引用的意义

String strongRef = String.valueof(Math.random());
String softRef = new SoftReference(String.valueof(Math.random()));

如果内存不够,强引用在生命周期内是不会被回收的,而软引用是可以被GC回收的。

优化OOM问题的方法

1.注意临时Bitmap对象的及时回收

2.避免Bitmap的浪费

3.Try catch某些大内存分配的操作

4.加载Bitmap:缩放比例、解码格式、局部加载