内存优化

由于Android系统的沙箱机制,分别给每个APP的内存大小是有限的。为了APP能在有限的内存下流畅地运行,通常需要对内存进行一定的优化。

Java中的存储空间

在Java中,存储空间通常包括以下几个部分:

  • 寄存器
    速度最快的存储场所,处于CPU内部,一般不在程序中进行控制。


  • 存放基本的数据类型和对象引用。


  • 存放使用new关键字创建的对象本身,由Java虚拟机的自动回收机制管理。

  • 静态存储区
    用来存储静态变量。

  • 常量池
    用来存储常量。

通常来说,当定义了一个变量,Java虚拟机会在栈中为其分配存内存空间,当变量的作用域结束后,这部分内存会被立刻回收;如果用new关键字创建一个对象,那么会在堆中为这个对象分配内存空间,即使对象的作用域结束了,这部分内存不会被立刻回收,而是等待虚拟机的垃圾回收器进行回收。所以,内存优化主要是指优化堆所指的内存。

内存泄露

虽然,Java虚拟机可以通过垃圾回收器自动回收堆中的内存,但是,垃圾回收器不能在所有情况下都能正确地回收内存,这样,就会造成部分内存无法被再使用,即所谓的内存泄露。

所以,内存优化的目的不仅要有效地利用内存,还要尽量避免内存泄露。

内存优化的方法

下面介绍一些常用的内存优化方法。

Bitmap优化

Bitmap通常会占用大量内存,通常会造成OOM(Out Of Memory)。使用Bitmap时,可以使用以下优化方法:

  • 使用适当分辨率的图片

由于Android系统在进行资源适配时,会根据屏幕分辨率加载对应分辨率的图片,如果在低分辨率的屏幕上加载高分辨率的图片,就会造成内存浪费。所以,在特定的屏幕上,只加载合适当分辨率的图片。另外,在对图像分辨率没有要求的地方,尽量使用低分辨率的图片。

  • 使用图片缓存

使用内存缓存和磁盘缓存可以更好地使用Bitmap。

代码优化

可以从代码的角度进行内存优化,下面是常用的一些方法:

  • 对常量使用static修饰,可以加快访问速度;
  • 尽量使用静态方法,静态方法比普通方法的访问速度更快;
  • 尽量使用静态内部类,这样可以避免内部类导致的潜在内存泄露;
  • 减少不必要的成员变量;
  • 减少不必要的对象,尽量使用基本类型;
  • 尽量不使用枚举和迭代器,因为枚举占用的内存比整型大,迭代器会占用一定的内存空间;
  • 对Cursor、Receiver、Sensor、File等对象,使用完毕后要注意回收和注销;
  • 避免使用IoC(控制反转)框架,这些框架通常使用注解和反射实现,大量使用会降低性能;
  • 使用RenderScript或OpenGL进行非常复杂的绘图操作;
  • 使用SurfaceView代替View进行频繁的绘图操作;
  • 尽量使用ViewHolder复用View;
  • 使用Android特有的数据结构,比如SparseArray和Pair,它们在Android平台上具有更好的性能;

Memory Profiler

Android Profiler工具中的Memory Profiler组件能够可视化APP内存使用情况,帮助开发者定位内存泄露。这个工具还提供了捕获堆内存释放、强制进行垃圾回收,以及跟踪内存分配等功能,帮助我们更好地对内存进行优化。

更多性能优化

Android的性能优化是一个比较大的话题,这里只介绍了常用的UI优化内存优化,其它方面的性能优化可以参考性能优化的官方文档

坚持原创技术分享,您的支持将鼓励我继续创作!