[http://wenku.baidu.com/view/688171b365ce0508763213f9.html]

Android内存使用研究
众所周知,在写 android 程序的时候,很容易出现 OOM ,而出现的时机大多数是由 Bitmap decode 引发的:
1
ERROR/AndroidRuntime(16350): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik:
dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是native+dalvik不能超过最大限制。
注:一旦内存分配给Java后,以后这块内存纵然开释后,也只能给Java的施用,这个估计跟java虚拟机里把内存分成好几块进行缓存的原因有关,反正C就别想用到这块的内存了,所以要是Java突然占用了一个大块内存,纵然很快开释了: C能施用的内存 = 16M - Java某一瞬间占用的最大内存。
而Bitmap的生成是通过malloc进行内存分配的,占用的是C的内存,这个也就说明了,上面所说的的4MBitmap无法生成的原因,因为在13M被Java用过后,剩下C能用的只有3M了。
用以下命令可以查看程序的内存使用情况:
adb shell dumpsysmeminfopackagename orpid程序的包名或者进程id





Android深入浅出开场白及课前准...Android Contex...






其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。
多数时候,发生OOM 都是在做一些跟图片相关的操作,以下提出一些建议尽量可以减少这种情况的发生:
1 .decode bitmap 的时候,尽量配置下Options,例如:inSameSize 2 .Bitmap使用完以后,调用 bitmap.recycle()来释放内存
3 .如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle 4.decode bitmap 的时候,将decode代码 try catch 出来,catch oom error,避免程序crash,可以在catch里面做一些释放内存操作

关于Android的Native内存和Dalvik内存 1. Dalvik内存
每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为 Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容; 同时还要两个明显的不同:
1.Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式DEX(Dalvik Executable)。 2.在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成CLASS文件后,还会通过一个工具(dx)将应用所有的 CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从其中读取指令和数据。
Dalvik虚拟机的简介:
Dalvik虚拟机主要是完成对象生命周期的管理,堆栈的管理,线程管理,安全和异常的管理,以及垃圾回收等等重要功能。
Dalvik虚拟机的主要特征Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU速度和大量的内存空间。 Dalvik虚拟机有如下几个主要特征:
1.专有的DEX文件格式
DEX是Dalvik虚拟机专用的文件格式,而问什么弃用已有的字节码文件(CLASS文件)而采用新的格式呢?一个应用中会定义很多类,编译完成后即会有很多相应的CLASS文件,CLASS文件间会有不少冗余的信息;而DEX文件格式会把所有的 CLASS文件内容整合到一个文件中。这样,除了减少整体的文件尺寸,I/O操作,也提高了类的查找速度。 2.增加了新的操作码的支












更多相关文章

  1. 编译Android(安卓)2.3.1 源代码心得
  2. android 调用系统相机拍照并保存照片原图
  3. Android(安卓)获取git 版本号
  4. 安卓APP:利用AndroidStudio开发usb串口通信软件【第2步】
  5. android studio基础教程:3.美化按钮
  6. Android:TabWidget
  7. Android(安卓)新建文件夹、生成文件并向文件写入文本内容
  8. Android(安卓)xml文件的序列化
  9. Android(安卓)javah -jni 找不到类的解决方法

随机推荐

  1. android OpenGL ES 2.0
  2. android 数据库操作异常
  3. 如何打包Android(安卓)Wearable 应用程序
  4. 第三章 Libgdx必备工具
  5. Android(安卓)studio 升级3.1.2, 运行之前
  6. Android零散收集
  7. 安卓学习笔记(一)搭建安装开发环境(android
  8. Android 中日期控件与下拉列表的使用
  9. android 内存泄漏解决
  10. android setbackgrounddrawable is depre