您现在的位置:诗歌范文 > 西方文学 > 正文

android Memory Management, OutOfMemoryError Note

	android Memory Management, OutOfMemoryError Note

 在Android中,一个Process只能使用16M内存(?),要是超过了这个限定就会跳出这个异常  ForAndroidspecificweshouldusetherecyclemethodratherthangc,becauserecyclewillfreethememoryatthesametime,butcallinggcdoesntguarantytorunandfreethememoryforsametime(ifitisnottoocritical,weshouldnotcallgcinourcode)recycleisfasterthanthegcanditimprovestheperformance.即:  biamap=null;效果要好于    ();通过DDMS中的Heap选项卡监视内存情况:视图中部有一个Type叫做dataobject,即数据对象,也就是我们的程序中大量存在的类类型的对象。 2.在dataobject一行中有一列是TotalSize,其值就是当前进程中所有Java数据对象的内存总量。 如果代码中存在没有释放对象引用的情况,则dataobject的TotalSize值在每次GC后不会有明显的回落,随着操作次数的增多TotalSize的值会越来越大,直到到达一个上限后导致进程被kill掉。

2  ViewgetView(=,===(position).id+=magaList.=magaList.滑动时内存会不断涨,直到OutOfMemory,使用Holder后便不会发生该请况,具体原因未仔细查找,标记一下。

1.对于常规开发者而言需要了解Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。 一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。

2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。

为每个程序分配的对内存可以通过Runtime类的totalMemory()freeMemory()两个方法获取VM的一些内存信息,().freeMemory();(,().freeMemory()));//格式化输出对于系统heap内存获取,可以通过类的getMinimumHeapSize()方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences()方法,获取更多的运行内存。 4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。

5.不要在循环中创建过多的本地变量。 .,应该调用Bitmap的recycle()来清理内存。

,这样跑下来,内存情况很理想,不管在哪个activity中,使用的资源仅仅是当前activity用到的,就不会象之前到最后一个activity的时候,所有之前使用的资源都累积在内存中。

  但新的问题又出现了,当返回之前的activity时,会出现trytousearecycledbitmap"的异常。 这真是按了葫芦起了瓢啊,内心那个沮丧。

。 。 没办法,继续分析。 看来是后加上recycle引起的,位图肯定在内存中有引用,在返回之前的activity时,因为位图数据其实已经被销毁了,所以才造成目前的情况。

在看了setBackgroundResource的源码以后,恍然大悟,android对于直接通过资源id载入的资源其实是做了cache的了,这样下次再需要此资源的时候直接从cache中得到,这也是为效率考虑。 但这样做也造成了用过的资源都会在内存中,这样的设计不是很适合使用了很多大图片资源的应用,这样累积下来应用的内存峰值是很高的。 看了sdk后,我用:Bitmapbm=((),);BitmapDrawablebd=newBitmapDrawable((),bm);(bd);来代替()。

销毁的时候使用:BitmapDrawablebd=(BitmapDrawable)();(0);//别忘了把背景设为null,避免onDraw刷新背景时候出现usedarecycledbitmap错误(null);().recycle();这样调整后,避免了在应用里缓存所有的资源,节省了宝贵的内存,而其实这样也不会造成太大效率问题,毕竟重新载入资源是非常快速,不会对性能造成很严重的影响,在xoom里我没有感受到和之前有什么区别。

总之,在android上使用大量位图是个比较痛苦的事,内存限制的存在对应用是个很大的瓶颈。 但不用因噎费食,其实弄明白了它里面的机制,应用可以突破这些限制的。 这只是其中的一种处理方法,还可以考虑的inSampleSize来减少内存占用。 引用:postedon2012-09-2915:53阅读(3834)。

上一篇:IP构建儿童生态体系,万达宝贝王打造授权“新玩法”
下一篇:没有了
回到顶部