欢迎来到天天文库
浏览记录
ID:42164623
大小:75.42 KB
页数:6页
时间:2019-09-09
《[精品]android内存溢出解决方案》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1.Heap&StackHeap(堆)Stack(栈)JVM中的功能内存数据区内存指令区存储数据对象实例⑴基本数据类型,指令代码,常量,对象的引用地址(2)1.保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是拒令,保存在stack中)。对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。nJava的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarr
2、ay、anewarray和multianewarray等指令建立'它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的>Java的垃圾收集器会自动收走这些不再使用的数据但缺点是,由于要在运行时动态分配内存'存取速度较慢。1-1“栈的优势是'存取速度比堆要快'仅次于寄存器'栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int,short,long,byte,fl
3、oat,double,boolean,char)和对象句柄。”垃圾回收GC是针对堆Heap的而栈因为本身是FILO-firstin,lastout.先进后出5能够自动释放。这样就能明白到new创建的,都是放到堆Heap!Android强制定义自己软件的对内存大小:privatefinalstaticintCWJ_HEAP_SIZE二6*1024*1024;VMRuntimc.gctRuntimc().sctMinimumHcapSizc(CWJ_HEAP_SIZE);使用dalvik.system.VMRuntime类
4、提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);FromAPI:Setsthecurrentidealheaputilization,rep
5、resentedasanumberbetweenzeroandone.AfteraGChappens,theDalvikheapmayberesizedsothat(sizeofliveobjects)/(sizeofheap)isequaltothisnumber.堆(HEAP)是VM中占用内存最多的部分,通常是动态分配的。堆的大小不是一成不变的,通常有一个分配机制来控制它的大小。比如初始的HEAP是4M大,当4M的空间被占用超过75%的时候,重新分配堆为8M大;当8M被占用超过75%,分配堆为16M大。倒过来,当1
6、6M的堆利用不足30%的时候,缩减它的大小为8M大。重新设置堆的大小,尤其是压缩,一般会涉及到内存的拷贝,所以变更堆的大小对效率有不良影响。上面只是个例子?不过可以看到三个参数:maxheapsize,minheapsize,heaputilization(堆利用率)。MaxHeapSize,是堆内存的上限值,Android的缺省值是16M(某些机型是24M),对于普通应用这是不能改的。函数setMinimumHeapSize其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配,当设置最小堆内存大小超过上限值时仍然
7、采用堆的上限值,对于内存不足没什么作用。setTargetHeapUtilization(floatnewTarget)可以设定内存利舟率的百分比,当实际的利用率偏离这个百分比的吋候,虚拟机会在GC的吋候调整堆内存大小,让实际占用率向个百分比靠拢。1.Android内存溢出问题但是如果程序在一次操作中打开儿个M的文件,那么通常会出现下面的错误信息。02-0421:46:08.703:ERROR/dalvikvm-heap(2429):1920000-byteexternalallocationtoolargeforth
8、isprocess.或02-0421:52:28.463:ERROR/AndroidRuntime(2429):java.lang.OutOfMemoryError:bitmapsizeexceedsVMbudget移动终端因为内存有限,往往图片处理经常出现上述的错误。解决方法:1•明确调用System.gc();这种内存回收会有
此文档下载收益归作者所有