Android中内存优化相关知识点

来源:互联网 发布:洛天依软件如何解压 编辑:程序博客网 时间:2024/05/22 14:07

为什么要进行内存优化

  • APP运行内存限制,OOM导致APP崩溃
  • APP性能:流畅性、响应速度和用户体验

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

  • 一个APP通常就是一个进程对应一个虚拟机
  • GC只在Heap剩余空间不够时才发出垃圾回收
  • GC触发时,所有的线程都是会被暂停

APP内存限制机制

  • 每个APP分配的最大内存限制,随不同设备而不同
  • 图片占用内存较多

内存管理机制的特点

  1. 更少的占用内存
  2. 在合适的时候,合理的释放系统资源
  3. 在系统内存紧张的情况下,能释放掉大部分不重要的资源,来为Android系统提供可用的内存
  4. 能够很合理的在特殊生命周期中,保存或者还原重要数据,以至于系统能够正确的重新恢复该应用。

切换应用时后台APP清理机制

  • APP切换时的LRU Cache
  • onTrimMemory()回调方法

APP内存优化方法

  • 数据结构优化
  • 对象服用
  • 避免内存泄漏
  • 当Service完成任务后,尽量停止它。
  • 在UI不可见的时候,释放掉一些只有UI使用的资源
  • 在系统内存紧张的时候,尽可能多的释放掉一些非重要资源
  • 避免滥用Bitmap导致的内存浪费
  • 使用针对内存优化过的数据容器
  • 避免使用依赖注入的框架
  • 使用ZIP对齐的APK
  • 使用多进程

数据结构的优化

  • 频繁字符串拼接用StringBuilder(如果用”+”拼接,则中间的+也会产生内存)
  • ArrayMap、SparseArray替换HashMap
  • 内存抖动

对象复用

  • 复用系统自带的资源
  • ListView/GridView的ConvertView复用
  • 避免在onDraw方法里面执行对象的创建

避免内存泄漏

  • 内存泄漏:由于代码瑕疵,导致这块内存,虽然是停止不用了,但依然被其他东西引用着,使得GC没法对它回收。
  • 内存泄漏会导致剩余可用Heap越来越少,频繁触发GC
  • 引用上下文时,建议使用Application Context而不是Activity Context
  • 注意Cursor对象是否及时关闭

什么是内存溢出oom

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出的out of memory异常。也就是内存溢出。

一些容易混淆的概念

  1. 内存溢出:就是oom out of memory异常
  2. 内存抖动:短时间内创建大量的对象,然后释放。瞬间产生的对象会严重占用内存区域。
  3. 内存泄漏:进程中的某些对象,没有被其他地方引用到,导致gc无法产生作用,当内存泄漏到一定程度时,会导致内存溢出的现象。

如何解决oom

  1. 解决Bitmap优化
  2. 其他方法

解决Bitmap优化

  1. 图片显示
  2. 及时释放内存
  3. 图片压缩
  4. inBitmap属性
  5. 捕获异常

其他方法

  1. listview:convertview/lru
  2. 避免在onDraw方法里面执行对象的创建
  3. 谨慎使用多进程

java内存的分配策略

  • 静态存储区(方法区)
  • 栈区(方法的局部变量)
  • 堆区(对象)

java是如何管理内存的

java的内存管理就是对象的生成和释放的过程,内存的释放是通过GC来完成的。

java中内存泄漏

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费成为内存泄漏。

Android内存泄漏

  1. 单例(context要使用Application context,而不是使用Activity context,防止使用Activity导致,Activity销毁无法回收而导致内存泄漏)
  2. 匿名内部类(匿名内部类一般持有外部类的引用,从而导致内存泄漏,解决办法是改变为静态内部类)
  3. handler(handler持有外部类的引用,里面有消息没处理,从而导致Activity无法回收,解决办法是使用静态handler,并使用弱引用来引用Activity)
  4. 避免使用static变量
  5. 资源未关闭造成的内存泄漏
  6. AsyncTask造成的内存泄漏
  7. Bitmap也需要调用recycle()方法