Android性能优化之内存优化

本文详细阐述了手机运行内存(RAM)的概念,分析了内存使用不当导致的问题,如崩溃和卡顿,并提出了全面的内存优化策略,包括内存泄漏预防、减少内存申请、布局优化、Bitmap优化、设备分级、缓存管理和进程管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.内存的概念
1.手机运行内存(RAM)就相当于我们电脑的内存,是手机中作为APP运行过程中临时性数据暂时存储的内存介质。
Android手机在出厂,虚拟机对单个应用可使用的最大内存做了限制,当你的应用使用内存超过这个限制就会产生OOM。
2.Java内存分配区:
 (1)静态存储区
     内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,主要存放静态数据、全局数据和常量。
 (2)栈内存区
      为编译器自动分配和释放,主要存放如函数参数、局部变量、临时变量、基本数据类型、句柄等。
  (3)堆内存区
      为成员分配和释放,有程序员自己申请和释放,如new出来的对象。
二..内存使用不当所产生的问题:
  1.崩溃
     主要就是我们经常遇到的内存不足时产生的OOM
  2.卡顿
     内存不足会导致频繁GC,从而造成卡顿;物理内存不足时系统会触发low memory killer机制,系统负载过高时造成卡顿的另外一个原因。
   
二.内存优化从哪些方面入手?
   1.内存泄漏
      内存泄漏就是不再使用的内存,没有被回收,这样就导致了内存的浪费。
      a.框架设计不合理造成的内存泄漏
      b.单例造成的内存泄漏
      c.非静态内部类造成的内存泄漏
      d.资源未关闭造成的内存泄漏
   2.减少内存申请
        a.避免创建不必要的对象
        例如:当需要频繁操作一个字符串时,使用StringBuffer代替String
        b.不要在for循环的第二个条件调用方法
         如:for(int i = 0;i < array.size();i++),应该写成
         int count = array.size() for(int i = 0;i < count;i++))
  3.布局优化
       a.减少布局层级
       b.纯色背景使用颜色代替图片
       c.合理使用merge、viewstup等。
  4. Bitmap优化
      a.整体的控制,如低端手机使用565格式、使用Glide、Fresco框架。
      b.合理的使用图片,如当图片的长宽远远大于view的长宽时,就要换图片。
      c.相同图片的重复使用。
  5.设备分级
       针对低端设备关闭耗内存的复杂动画或者一些功能。
  6.缓存管理
       有时为了快速的展示数据,我们会把一些数据缓存在内存中,当一个大型的APP存在很多模块时,就可能会缓存很多不同的数据,这时候我们就需要有一个统一的缓存管理,这样当内存使用过高时可以及时释放内存中的缓存。
  7.进程管理 
    一个空的进程也会占用10M的内存,有些APP会有好几个进程,所以合理的使用进程,减少常驻进程也是内存优化的关键。
  8.安装包的大小
       安装包的大小也会影响内存的使用。
   9.数据相关优化
    慎用Shareprefercance,因为同一个SP会将整个XML存入内存,有时候为了读一个文件就要将整个XML存入内存,如使用到数据库,数据库字段尽量精简
    
四.内存使用分析?
    内存分析对于解决内存问题是至关重要的,通过内存分析可以清楚的知道哪些地方使用内存不当,从而有针对性的进行完善。
   1.使用AndroidStudio3.0新增的profile分析内存使用情况(profile具体使用这里不做介绍,会有专门的章节做介绍)。
   2.使用LeakCanary检查内存泄漏。
    LeakCanary使用介绍:
    (1)在app build.gradle 中加入引用:
    

dependencies {
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
}


(2)在Application的oncreate方法中加入:

  if (LeakCanary.isInAnalyzerProcess(this)) {//1
      // This process is dedicated to LeakCanary for heap analysis.
      // You should not init your app in this process.
      return;
    }
    LeakCanary.install(this);


    这样我们就可以使用LeakCanary了,当有某个Activity内存泄漏时就会发出通知提示:

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值