Android 性能优化(二)

来源:互联网 发布:linux 端口扫描工具 编辑:程序博客网 时间:2024/06/07 20:05

2.内存优化

(1) 什么是内存

由于Android应用的沙箱机制,每个应用所分配的内存大小是有限度的,内存太低会触发-LMK(Low Memory Killer ) 机制。通常情况下我们所说的内存是指手机的RAM, 它包括以下几个部分

  • 寄存器
    速度最快的存储场所,寄存器位于处理器内部,在程序中无法控制


  • 存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中


  • 堆内存用来存放由 new 创建的对象和数组。 在堆中分配的内存,由java 虚拟机的自动垃圾回收器GC 来管理

  • 静态存储区域
    静态存储区域就是在固定的位置存放应用程序运行时一直存在的数据,java在内存中划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量

  • 常量池
    JVM 虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量和对其他类型、字段和方法的符号引用。

(2) 获取Android 系统内存信息

  • Process States
    可以使用Dumpsys 命令来获取这些信息,命令如下:
adb shell dumpsys procstats
  • Meminfo
adb shell dumpsys meminfo

(3) 内存回收

Java 对于C 、C++ 这类语言最大的优势就是不用手动管理系统资源,java创建了垃圾收集器线程来自动进行资源的管理。这样做的好处是大大降低了程序开发人员对内存管理的繁琐工作。

(4) 内存优化实例

  • Bitmap 优化
    缩放加载大图片
    及时回收内存,bitmap.recycle()
    使用图片缓存,内存缓存(LruCache) 和硬盘缓存(DiskLruCache)

  • 代码优化
    常量使用static final 修饰
    使用静态方法
    减少不必要的成员变量
    减少不必要的对象尽量不要使用枚举,少用迭代器
    及时关闭Stream、Cuosor等,对广播进行解注册
    使用SurfaceView来代替View进行大量、频繁的绘图操作
    使用StringBuffer代替“+”号进行字符串拼接
    使用ItentService 代替 Service
    使用SpaseArray 代替 HashMap等