在android开发中应该如何管理内存或者是在开发过程中应该注意哪些问题来较少OOM?
2013-03-01 17:30
891 查看
1.
为了能够使Android应用程序能够高效快速地运行,所以 Android的每个应用程序都会用一个专有的Davilk虚拟机实例对象来运行,这个Davilk对象是由Zygote服务进程孵化出来的,这样的机制 使每个应用进程都只能在属于自己的进程空间中运行。Android为不同类型的进程分配了不同的内存使用上限,也就是设置了一个阈值,当这个上限被超过 时,就视为OOM,通过一定的选择策略,某些进程就会被系统kill掉以释放内存。
在编程中有些现象很容易造成造成内存泄露,我们应该尽量避免:
一.引用没释放造成的内存泄露
二.资源对象没关闭造成的内存泄露(比如没有关闭访问文件的输入输出流)
三.Bitmap没调用recycle(Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.)
四.构造Adapter时,没有使用缓存的 convertView
五.一些不良代码成内存压力(一些代码虽然不会直接造成内存泄露,但是它一直占用内存就会影响其他进程访问内存,间接造成OOM)
2.
这个问题其实其他的编程语言一样,都存在这个问题,说白了就是变成的技巧和经验问题。对不使用的资源要做到及时的释放。
给你个公式:
可使用的内存 = 16M - Java某一瞬间占用的最大内存
另外可以参考下这个资料:http://wenku.baidu.com/view/05b2d31d650e52ea551898f0.html
3.
处理图片时可以使用弱引用,jvm会更快的回收资源。创建Bitmap时,可以使用BitmapFactory.decodeStream(is)代替createBitmap这个方法。同时用完的bm要尽快回收。几个小技巧,开发时一般都会用到。
4.
我只遇见过从网上加载大图OOM的情况,记得当时是为Bitmap建立了一个三级的缓存机制,类似于计算机的cache——主存——外存一样的,对应 着:Bitmap强引用(Dalvik内存)——Bitmap软引用——SD卡,Decode时也要先Decode尺寸,按需解码。设计好算法,参考一些 开源的库。
5.
在做项目中遇到类似的问题,原因在于使用的图片在不用后未能及时回收资源。
图片资源使用后:
if(!bitmap.isRecyle()){
bitmap.recycle();
System.gc();
bitmap=null;
}
---您好,我知道您所说的优化,但是Imageview在一个listview里面,填充的时候是多线程调用填充,如果协商上面的代码就会报错。就是释放以后有引用它了,请问如果这样,在那里释放比较好?
为了能够使Android应用程序能够高效快速地运行,所以 Android的每个应用程序都会用一个专有的Davilk虚拟机实例对象来运行,这个Davilk对象是由Zygote服务进程孵化出来的,这样的机制 使每个应用进程都只能在属于自己的进程空间中运行。Android为不同类型的进程分配了不同的内存使用上限,也就是设置了一个阈值,当这个上限被超过 时,就视为OOM,通过一定的选择策略,某些进程就会被系统kill掉以释放内存。
在编程中有些现象很容易造成造成内存泄露,我们应该尽量避免:
一.引用没释放造成的内存泄露
二.资源对象没关闭造成的内存泄露(比如没有关闭访问文件的输入输出流)
三.Bitmap没调用recycle(Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.)
四.构造Adapter时,没有使用缓存的 convertView
五.一些不良代码成内存压力(一些代码虽然不会直接造成内存泄露,但是它一直占用内存就会影响其他进程访问内存,间接造成OOM)
2.
这个问题其实其他的编程语言一样,都存在这个问题,说白了就是变成的技巧和经验问题。对不使用的资源要做到及时的释放。
给你个公式:
可使用的内存 = 16M - Java某一瞬间占用的最大内存
另外可以参考下这个资料:http://wenku.baidu.com/view/05b2d31d650e52ea551898f0.html
3.
处理图片时可以使用弱引用,jvm会更快的回收资源。创建Bitmap时,可以使用BitmapFactory.decodeStream(is)代替createBitmap这个方法。同时用完的bm要尽快回收。几个小技巧,开发时一般都会用到。
4.
我只遇见过从网上加载大图OOM的情况,记得当时是为Bitmap建立了一个三级的缓存机制,类似于计算机的cache——主存——外存一样的,对应 着:Bitmap强引用(Dalvik内存)——Bitmap软引用——SD卡,Decode时也要先Decode尺寸,按需解码。设计好算法,参考一些 开源的库。
5.
在做项目中遇到类似的问题,原因在于使用的图片在不用后未能及时回收资源。
图片资源使用后:
if(!bitmap.isRecyle()){
bitmap.recycle();
System.gc();
bitmap=null;
}
---您好,我知道您所说的优化,但是Imageview在一个listview里面,填充的时候是多线程调用填充,如果协商上面的代码就会报错。就是释放以后有引用它了,请问如果这样,在那里释放比较好?
相关文章推荐
- Android高级开发第一讲--如何在Android应用中避免内存溢出OOM问题
- Android高级开发第一讲--如何在Android应用中避免内存溢出OOM问题
- Android高级开发第一讲--如何在Android应用中避免内存溢出OOM问题
- 多线程下WinForm开发应该注意哪些问题?
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- Android开发中如何解决加载大图片时内存溢出的问题
- Android开发中使用static变量应该注意的问题
- Android架构师或者独立开发,前期搭框架应该做哪些事情
- 在Ubuntu上进行Android开发时, 搭建环境应该注意的几个问题
- 与人交谈的过程中 应该注意哪些问题
- 如何解决IOS开发过程中,服务器为windows或者不含有CA证书的推送问题"
- 如何管理app的进程与内存分配,以及在Android开发应用的时候如何主动的减少内存的使用
- Android开发过程遇到的安装好的APP打开程序崩溃,或者安装后应用列表里没有的问题及解决方案
- android开发中应该注意的问题
- 在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?
- Android 开发打包时我们应该如何注意平台的兼容(x86,arm,arm-v7a)
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- 多线程下WinForm开发应该注意哪些问题?(转)
- 多线程下WinForm开发应该注意哪些问题?
- [Android 性能优化系列]内存之提升篇--应用应该如何管理内存