android 精华Android干货android性能优化

Android之内存管理及优化-干货

2015-04-01  本文已影响7882人  wingjay

一、Android内存基础##

  1. 物理内存与进程内存
    物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(16M,32M不定),这块内存空间会映射到RAM上某个区域。然后这个Android程序就会运行在这块空间上。Java里会将这块空间分成Stack栈内存Heap堆内存。stack里存放对象的引用,heap里存放实际对象数据。
    在程序运行中会创建对象,如果未合理管理内存,比如不及时回收无效空间就会造成内存泄露,严重的话可能导致使用内存超过系统分配内存,即内存溢出OOM,导致程序卡顿甚至直接退出。

  2. 内存泄露(Memory Leak)
    Java内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。Dalvik VM具备的GC机制(垃圾回收机制)会在内存占用过多时自动回收,严重时会造成内存溢出OOM。

  3. 内存溢出OOM
    当应用程序申请的java heap空间超过Dalvik VM HeapGrowthLimit时,溢出。
    注意:OOM并不代表内存不足,只要申请的heap超过Dalvik VM HeapGrowthLimit时,即使内存充足也会溢出。效果是能让较多进程常驻内存。

  4. 如果RAM不足时系统会做什么?
    Android的Memory Killer会杀死优先级较低的进程,让高优先级进程获取更多内存。

  5. Android系统默认内存回收机制

如果用户按Home键返回桌面,那么该app成为Background进程;如果按Back返回,则成为Empty进程

回收未被引用对象

二、优化##

  1. Bitmap优化
    Bitmap非常消耗内存,而且在Android中,读取bitmap时, 一般分配给虚拟机的图片堆栈只有8M,所以经常造成OOM问题。所以有必要针对Bitmap的使用作出优化:

问题:Android不是自身具备垃圾回收机制吗?此处为何要手动回收。
Bitmap对象不是new生成的,而是通过BitmapFactory生产的。而且通过源码可发现是通过调用JNI生成Bitmap对象nativeDecodeStream()等方法)。所以,加载bitmap到内存里包括两部分,Dalvik内存Linux kernel内存。前者会被虚拟机自动回收。而后者必须通过recycle()方法,内部调用nativeRecycle()让linux kernel回收。

  1. 对象引用类型

关于java对象引用类型,具体可参加本人另一篇文章

  1. 池 pool
  1. 缓存

关于android缓存机制,具体可参加本人另一篇文章

参考文章:

Android性能、内存优化
Android操作系统的内存回收机制-IBM
Bitmap内存优化
内存优化合集

上一篇下一篇

猜你喜欢

热点阅读