Android开发之内存的优化

作者: zzj丶 | 来源:发表于2017-03-14 22:59 被阅读129次

一、查看当前手机的在单进程中所分配的内存

  StringBuilder builder = new StringBuilder();
        ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        int memory = manager.getMemoryClass();
        int largeMemory = manager.getLargeMemoryClass();
        builder.append("分配内存为:"+memory+"\n");
        builder.append("最大分配内存:"+largeMemory);
        mTextMessage.setText(builder.toString());
        Log.d("main","分配内存为:"+memory+"\n"+"最大分配内存:"+largeMemory);

二、内存的管理方式

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

    一个App通常就是一个进程对应一个虚拟机
    GC只在Heap剩余空间不够时才发出垃圾回收信号
    Gc触发时,所有的线程都会出现暂停,出现内存抖动

2、App内存限制

    每个App分配的最大内存限制,随不同设备而不同
    占用内存的大户:图片

3、切换应用时后台App清理机制

    App切换时的LRU Cache:LRU算法最近使用的排在最前面,最少的可能被清理掉。

    随着内存的减少系统会通过OnTrimMemory方法通知App,进而进行相应的处理。

4、监控内存的集中方法演示:

    代码方式:
   //空闲内存
        long freeMemory = Runtime.getRuntime().freeMemory();
        //总内存
        long totalMemory = Runtime.getRuntime().totalMemory();
        //最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
    通过Android Studio自带的工具

三、内存优化方法

a)数据结构优化

  频繁字符串拼接用StringBuilder
  ArrayMap、SparseArray替换HashMap
  内存抖动:频繁的生成对象,
  再小的Class也要耗费0.5K
  HashMap一个entry需要额外占用的32B

b)对象的复用

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

c)避免内存泄漏

  由于代码瑕疵,导致这块内存虽然停止不用了,但依然被其他东西引用着,使得GC没法对它回收。
  内存泄漏会导致剩余的可用heap越来越少,导致GC频繁。
  用Application Context而不是Activity Context;
  注意Bitmap ,Cursor,Io等对象是否及时回收或关闭

四、OOM问题优化

a)OOM问题分析

    Oom的必然性与可解决性(内存的分配限制)
    OOM的大部分发生在图片处理的地方

b)强引用、软引用的意义

    在当前的活动界面中强引用对象的内存不会发生变化,而软引用会由于内存的变小,有被回收的可能。
    强引用与软引用的使用场景:bitmap

c)优化OOM问题方法

    注意临时Bitmap对象的及时回收
    避免Bitmap的浪费
    Try catch某些大内存分配的操作
    加载Bitmap:缩放比例、解码格式、局部加载。

相关文章

网友评论

    本文标题:Android开发之内存的优化

    本文链接:https://www.haomeiwen.com/subject/mmeknttx.html