zoukankan      html  css  js  c++  java
  • Android 内存优化

    一、内存机制:
         C/C++:“谁污染,谁治理”。 

         java:请了一个专门的清洁工(GC)。
    二、内存溢出为何会发生:
         Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就

         会出现OutOfMemory的错误。
    三、内存不够用的原因:
         1、长期保持某些资源(如Context)的引用
         2、保持了多个耗用内存过大的对象(如Bitmap)

    四、解决内存溢出的方法

      1、慎用static
              static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。

              所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context的情况最多),这时就要谨慎对待了。
      2、线程导致
              线程也是导致内存泄露的一个重要的源头。主要原因在于线程生命周期的不可控

      3、慎用AsyncTask
              Thread:只有在run函数不结束时会出现内存泄露
              AsyncTask:内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的。

              因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。
              这种线程导致的内存泄露问题应该如何解决呢?
              (1)将线程的内部类,改为静态内部类。
          (2)在线程内部采用弱引用保存Context引用。

      4、注意并优化Bitmap

         1.及时销毁recycle
         2.设置一定的采样率
                options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一  
         3.巧妙的运用软引用(SoftRefrence)
         4.及时关闭Cursor

                   cursor.close();

      5、图片尽量使用9path图片
      6、Adapter要使用convertView或者ViewHolder

  • 相关阅读:
    ffmpeg命令行获取RTSP流并每秒截取一张解码存储为jpg
    快速排序
    ffmpeg参数中文详细解释
    Docker
    elasticsearch的安装和配置
    C 语言-运算符(算术运算符,类型转换,赋值运算符,自增,自减,sizeof 运算符,逗号运算符,关系运算符,逻辑运算符,三目运算符)
    c语言-printf函数和scanf函数简单使用
    将JPA通用的实现方法封装成一个抽象类进行拓展
    工具类里的静态变量如何获取application.yml或者application.properties里的属性
    记java实体类属性名为全部为大写踩的坑(基础)
  • 原文地址:https://www.cnblogs.com/zhangping/p/3571423.html
Copyright © 2011-2022 走看看