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