Android-在android开发中怎样减少OOM问题

Android-在android开发中怎样减少OOM问题

偏爱自由 发布于 2017-04-16 字数 82 浏览 936 回复 7

在android开发中应该如何管理内存或者是在开发过程中应该注意哪些问题来较少OOM?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

泛泛之交 2017-11-01 7 楼

在做项目中遇到类似的问题,原因在于使用的图片在不用后未能及时回收资源。
图片资源使用后:
if(!bitmap.isRecyle()){
bitmap.recycle();
System.gc();
bitmap=null;
}

泛泛之交 2017-09-22 6 楼

为了能够使Android应用程序能够高效快速地运行,所以Android的每个应用程序都会用一个专有的Davilk虚拟机实例对象来运行,这个Davilk对象是由Zygote服务进程孵化出来的,这样的机制使每个应用进程都只能在属于自己的进程空间中运行。Android为不同类型的进程分配了不同的内存使用上限,也就是设置了一个阈值,当这个上限被超过时,就视为OOM,通过一定的选择策略,某些进程就会被系统kill掉以释放内存。

在编程中有些现象很容易造成造成内存泄露,我们应该尽量避免:
一.引用没释放造成的内存泄露
二.资源对象没关闭造成的内存泄露(比如没有关闭访问文件的输入输出流)
三.Bitmap没调用recycle(Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.)
四.构造Adapter时,没有使用缓存的 convertView
五.一些不良代码成内存压力(一些代码虽然不会直接造成内存泄露,但是它一直占用内存就会影响其他进程访问内存,间接造成OOM)

补充:大量读取图片,比如listview或者相册,读取网络图片时,使用软引用(SoftReference),让系统能够自动的利用内存空间

偏爱自由 2017-08-16 5 楼

这个问题其实其他的编程语言一样,都存在这个问题,说白了就是变成的技巧和经验问题。对不使用的资源要做到及时的释放。

给你个公式:
可使用的内存 = 16M - Java某一瞬间占用的最大内存

另外可以参考下这个资料:http://wenku.baidu.com/view/05b2d31d650e52ea551898f0.html

泛泛之交 2017-08-12 4 楼

处理图片时可以使用弱引用,jvm会更快的回收资源。创建Bitmap时,可以使用BitmapFactory.decodeStream(is)代替createBitmap这个方法。同时用完的bm要尽快回收。几个小技巧,开发时一般都会用到。

清晨说ぺ晚安 2017-07-18 3 楼

我只遇见过从网上加载大图OOM的情况,记得当时是为Bitmap建立了一个三级的缓存机制,类似于计算机的cache——主存——外存一样的,对应着:Bitmap强引用(Dalvik内存)——Bitmap软引用——SD卡,Decode时也要先Decode尺寸,按需解码。设计好算法,参考一些开源的库。

归属感 2017-05-24 2 楼

你可以通过查看LOGCat来进行判断和处理,在程序运行时,LogCat会偶尔打出这个样蓝色文字提示:

D/dalvikvm(3524): GC_EXPLICIT freed 7K, 45% free 3543K/6343K, external 1225K/1615K, paused 68ms

这里就是系统在进行GC回收,如果你的程序频繁的出现这个提示,那么就需要优化了。
这里的优化就要根据你的实际情况了,比如你在listview滑动时发现GC回收频繁,那你应该去看下你的适配器是怎么写的,是不是在getView里频繁的创建了布局而没有用系统的convertView参数?如果在访问网络或者读写文件时GC回收频繁,那你要看看接收数据时是采用流的方式还是数组的方式?数组会占用更多的内存。其他情况就不列举啦。
希望对你有帮助。

晚风撩人 2017-05-12 1 楼

在4.0及以上的机型中,android的应用程序的内存上限可以达到64M。而且在3.0及以上的机型中,manifest有个属性android:largeHeap属性,设置成true,内存上限可以超过64M。不过郁闷的是,在2.x的手机上,内存上限只能是32M了,而且native内存达到20多M时就会报OOM。