android 内存优化

在说明内存优化前,先用工具来说明

android 应用的内存分布

上面是一个默认的android项目

里面很清楚的描述了应用内存的各种占比

  • Java:从 Java 或 Kotlin 代码分配的对象的内存。
  • Native:从 C 或 C++ 代码分配的对象的内存。

  • Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)

  • Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。

  • Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。

  • Others:您的应用使用的系统不确定如何分类的内存。

  • Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。

java  可以理解为堆。堆的介绍参考《深入理解java jvm》中

Java堆 : 是虚拟机所管理的内存中最大的一块。 Java 堆是被所有线程共享的一块内存区域,是垃圾收集器管理的内存区域。
一般来说分为三代 新生代,老年代,永久代。回收机制先回收新生代, 如果新生代 回收后还是空间不足, 就会继续回收老年代,如果依然不足,在继续回收永久代,如果在不足, 就报溢出
新生代,老年代,永久代 是划分是根据算法来分配的,一般来说是根据对象存在的持续时间。

总结来说就是减少对象的内存占比  一般来说图片资源及时释放,避免不必要的对象开销

Native 暂时不用解释

Graphics 后面在单独解释

Stack 可以理解为栈。栈的介绍参考《深入理解java jvm》中

栈是线程私有,它的生命周期与线程相同。是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

总结来说就是控制线程数,避免多个线程, 一般来说就是线程池

Code  理解为代码量和资源

代码量:推荐《重构》

资源: 缩减应用大小
官方文档 https://developer.android.com/topic/performance/reduce-apk-size#support-densities

简单介绍

缩减资源数量和大小 

APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。缩减 APK 大小的一种简单方法是缩减其包含的资源数量和大小。具体来说,您可以移除应用不再使用的资源,并且可以用可伸缩的 Drawable 对象取代图片文件。此部分将讨论上述这些方法,以及另外几种可减少应用中的资源以缩减 APK 总大小的方法。

仅支持特定密度

尽管 Android 支持所有这些密度,但您无需将光栅化资源导出为每个密度。

使用可绘制对象 

某些图片不需要静态图片资源;框架可以在运行时动态绘制图片。Drawable 对象(XML 中为 <shape>)会占用 APK 中的少量空间。此外,XML Drawable 对象会生成符合 Material Design 准则的单色图片。

重复使用资源 

压缩 PNG 文件

压缩 PNG 和 JPEG 文件 

使用 WebP 文件格式

使用矢量图形

避免使用枚举 

单个枚举会使应用的 classes.dex 文件增加大约 1.0 到 1.4KB 的大小。这些增加的大小会快速累积,产生复杂的系统或共享库。如果可能,请考虑使用 @IntDef 注释和代码缩减移除枚举并将它们转换为整数。此类型转换可保留枚举的各种安全优势。

等。 

以上就是我们常用的优化手段


 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值