免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1791 | 回复: 0
打印 上一主题 下一主题

andorid 我们该如何管理你的内存? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-25 14:05 |只看该作者 |倒序浏览
转:tankaixiong

andorid 我们该如何管理你的内存?



andorid 我们如何管理你的内存?
tank前面做项目时遇到了一个错误:java.lang.OutOfMemoryError
我当时就没有花很多时间去处理内存这个问题。当时就以自己JAVA编程时的习惯以为像PC编程一样,自顾的一顿敲下去。
因为前面我也有做嵌入式方面的开发,当时是基于纯C的嵌入式开发,在程序开发时格外的小心指针和内存的分配,一不小心就会造成把机子内存泄露最后导致死机。
因为JAVA里没有指针,也不能像C里一样Malloc和free,JAVA是自己管理内存的分配和释放所以我一开始也不把内存放在心上,直致java.lang.OutOfMemoryError。
尤其在处理大量图像和做游戏开发时会经常碰到这类问题,所以要额外注意了。
以下我总结和归纳了下内存方面的东东,希望大家一起交流进步,有误之处请大家指正和完善。
如何优化内存管理:
1.在循环内尽量不要使用局部变量。
2.不用的对象可以把它指向NULL,并注意自己的代码质量。
3.显示让系统GC回收
if(bitmapObject.isRecycled()==false) //如果没有回收
         bitmapObject.recycle();   //http://www.cnblogs.com/tankaixiong/
4.对大型图片进行缩放有,处理图片时我们经常会用到BitmapFactory类,android系统中读取位图Bitmap时分给虚拟机中图片的堆栈大小只有8M。
用BitmapFactory解码一张图片时,有时也会遇到该错误。这往往是由于图片过大造成的。这时我们需要分配更少的内存空间来存储。
BitmapFactory.Options.inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。inSampleSize的具体含义请参考SDK文档。Android提供了一种动态计算的

方法,可以去查看源码,这里不多讲。
例如:
  1. BitmapFactory.Options opts = new BitmapFactory.Options();
  2.     opts.inSampleSize = 4 ;
  3.     Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);
复制代码
5.Dalvik.VMRuntime类,提供对虚拟机全局,Dalvik的特定功能的接口。
Android为每个程序分配的对内存可以通过Runtime类的 totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的

getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,收集可用内存。
我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:

private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。

使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,

这里我们仅说下使用方法:
private final static float TARGET_HEAP_UTILIZATION = 0.75f;

在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

6.缓存,适量使用缓存,不要过量使用,因为内存有限,能保存路径地址的就不要存放图片数据,不经常使用的尽量不要缓存,不用时就清空。

7.尽量使用Android 自己一套的机制,因为android是基于Dalvik而非JVM。

  1. InputStream is = null;
  2.          try {
  3.          is = new FileInputStream(new File(picstr));
  4.    
  5.          } catch (FileNotFoundException e) {
  6.         // http://www.cnblogs.com/tankaixiong/
  7.         // }
复制代码
下面这个方法肯定优于上面这个方法。
  1. Resources re = mContext.getResources();
  2.          InputStream is = re.openRawResource(picstr);
复制代码
希望大家在这里一起来探讨!http://www.cnblogs.com/tankaixiong/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP