一、为什么要进行内存优化
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缩放比例、解码格式、局部加载