在Android开发中,有哪些好的内存优化方式?

在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?
在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常。 
那么,开发中,有哪些措施能避免这个问题呢?不仅仅是Bitmap的处理,其他方面也会导致OOM。有哪些好的内存优化方式呢?


---------------------


对于OOM,其实最重要的是注意不要Memory Leak。而Memory Leak是会有多个方面会引起的,比如Drawable, RemoteViews, Receiver, Cursor,InputStream, MediaPlayer等,此外,如果使用JNI也会因为C或C++的代码导致Memory Leak。 


除了Memory Leak,大数据量的操作也会导致OOM,比如之前其他回答提到的Bitmap,还有ListAdapter,如果在getView时处理不当,也很容易导致OOM,所以在ListAdapter时应该尽量使用convertView。 


最后,可以用android.os.StrictMode以及Eclipse的MAT工具来进行OOM和Memory Leak的检测。


---------------------


我的做法是时间换空间,尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,可以参考这个开源组件的实现。http://code.google.com/p/android-imagedownloader/ 其将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。 


除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件?需要都留在内存中吗?目前我做的应用,每次请求的数据大小都比较小,每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。 


经常会OOM我觉得就是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds 
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
拿到这个图片的大小,再算好缩放比例
int scale = 0;
scale = (int)(options.outHeight / (float)size);
if (scale <= 0) {
scale = 1;
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
再进行decode。




总之就是尽量时间换空间,实际这个时间是非常非常短的,用户体验内的。


---------------------


自己用的两个方法
1.手动管理activty栈 即跳转时 finish 上一个activity
这样可以省很大內存
2.野路子 将内存的使用转移到 c层 通过使用jni malloc获得的内存是没有16m限制的 我在samsung 2g内存的手机上 最大可以申请到1.5GB内存


---------------------


对于图片要注意recycle吧,分辨率大的图片也要使用BitmapFactory.decode来降低分辨率,减少内存占用,资源图片也要注意不要使用太大的图片


---------------------


网络上很多相关内容,但是没有统一的解决方案
最后都会说
1.recycle所有对象,排除程序对该对象的引用,然后System.gc(),但有时候不能根本的解决问题,因为android内部的对内存的限制机制导致的
2.bitmap是在我开发过程中,oom最多的地方,最后结论是,只能大幅度的缩小图片比例


---------------------


可以用MAT来检查内存泄露,或者用Monkey Test也能够帮助发现应用的内存泄露。
但内存使用的优化就看工程师的功力了。


---------------------


V4包里有很好用的cache你也可以用guava库来实现cache功能。虚拟机垃圾回收有它自己的一套规则你可以参考相关的资料。bitmap的压缩你可以通过屏幕的实际宽高来适配


---------------------


图片销毁一定要recycle,尽量使用SoftReference,网上可以找到资料。


---------------------


使用泛型算法或者泛型容器多多少少都会引起Memory Leak,在现代面向对象编程中似乎Memory Leak已经无法避免了,总之能自己写的算法就不要用泛型。


---------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值