一、为什么要进行内存优化

1.每个APP运行内存都有限制,运行内存不够时导致APP崩溃

 2.当APP所占用的内存快占满手机内存时,影响APP的性能,例如流畅度和响应速度
//下面我们来看看看如何获取手机的内存和最大内存
 ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

 int memoryClass = activityManager.getMemoryClass();

 int largeMemoryClass = activityManager.getLargeMemoryClass();

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

1.一个APP对应一个进程,对应一个虚拟机

2.GC只会在堆内存剩余空间不够才会发出垃圾回收

3.GC出发的时候,如果时间比较长,回收大量内存,所有线程会被暂停,这样才会导致不流畅和卡顿

三、APP内存限制和清理机制

1.APP所分配的最大内存,随着不同设备而不同

2.比较消耗内存的主要是图片,高清大量图片加载

3.在后台APP切换时,使用的LRUCache清理机制,最近用的排在前面,清理靠后的APP

四、APP内存优化方法

1、数据结构优化

1>频繁字符串的拼接使用StringBuilder而不是直接+,StringBuilder拼接字符串效率高,而相加的方式会产生中间字符串内存块,这些都是没有用的内存块,频繁的拼接会产生中间字符串,这些字符串会被回收,导致拼接速度慢

2>ArrayMap、SparseArray替换HashMap,一方面是他们内存使用较少,而且数据量多的时候他们效率高点

3>避免内存抖动(一下子申请很多内存,用完然后不用,然后又申请很多内存,然后又不用,这样如果内存不够,会引起GC回收的频率高点,导致线程暂停),例如嵌套for循环new对象

4>再小的class也耗费0.5kb,HashMap的entry需要额外32b

2、对象的复用

1>适配器的ConvertView的复用

2>避免在OnDraw中执行对象创建(对象创建时间较长的话会导致界面重绘卡顿,尽量放外面)

3、内存泄漏

内存泄漏:由于代码问题,这一块内存虽然不被使用,但是仍然被其他东西保持着引用,导致GC无法回收

内存泄漏会导致剩余可用的内存越来越小,频繁出发GC,尤其是Activity导致的泄漏

使用Application的Context而不是Activity的context

注意Cursor数据库指针对象是否关闭

注意广播是否注销

五、OOM问题优化

1>强引用和软引用,强引用即我们平时自己新建对象,在方法中新建的对象,那么该对象的生命周期跟方法同步,如果是全局变量,那么该变量的生命周期跟类同步,不会被回收,而软引用则是在系统内存不够的时候会去回收对象;

2>注意临时Bitmap对象的及时回收和值空

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

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