Android虚拟机(DVM)内存分配——内存溢出问题
来源:互联网 发布:为淘宝店添加背景音乐 编辑:程序博客网 时间:2024/05/29 18:07
转载自:http://chenfeng0104.iteye.com/blog/1164989、
Android虚拟机(DVM)内存
大家都知道Android的上层应用是基于 Dalvik Virtual Machine的。Dalvik VM的特点是基于寄存器,相比SUN的JVM(基于堆栈,没有寄存器)来说,理论上完成同样的功能需要的指令条数少,但是指令集复杂。到了Android2.2,Dalvik终于实现了JIT(Just In Time)功能,前进了一大步。
近期我们遇到OutOfMemory的错误,通常是堆内存溢出。网上有些帖子说可以通过函数设置应用的HEAP SIZE来解决这个问题,其实是不对的。
VMRuntime.getRuntime().setMinimumHeapSize(NewSize);
堆(HEAP)是VM中占用内存最多的部分,通常是动态分配的。堆的大小不是一成不变的,通常有一个分配机制来控制它的大小。比如初始的HEAP是4M大,当4M的空间被占用超过75%的时候,重新分配堆为8M大;当8M被占用超过75%,分配堆为16M大。倒过来,当16M的堆利用不足30%的时候,缩减它的大小为8M大。重新设置堆的大小,尤其是压缩,一般会涉及到内存的拷贝,所以变更堆的大小对效率有不良影响。
上面只是个例子,不过可以看到三个参数:max heap size, min heap size, heap utilization(堆利用率)。
Max Heap Size,是堆内存的上限值,Android的缺省值是16M(某些机型是24M),对于普通应用这是不能改的。函数setMinimumHeapSize其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配,当设置最小堆内存大小超过上限值时仍然采用堆的上限值(16M),对于内存不足没什么作用。
setTargetHeapUtilization(float newTarget) 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。
//程序onCreate时调用
private final static floatTARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
总结:
手机应用开发资源是很有限的,堆内存的上限值只有16M。不过只要代码写的好,这个值对于目前的手机应用需求已经足够了。
如果出现内存溢出问题,把精力放在代码优化上吧。
分配——内存溢出问题- Android虚拟机(DVM)内存分配——内存溢出问题
- Android虚拟机(DVM)内存分配——内存溢出问题
- Android虚拟机(DVM)内存分配——内存溢出问题
- Android虚拟机(DVM)内存分配——内存溢出问题
- Android虚拟机(DVM)内存分配——内存溢出问题
- Android学习札记25:对Android虚拟机(DVM)内存分配的一些理解
- Android Dalvik虚拟机内存分配问题
- Android Dalvik虚拟机内存分配问题
- Android Dalvik虚拟机内存分配问题
- Android Dalvik虚拟机内存分配问题
- Android Dalvik虚拟机内存分配问题
- android内存溢出问题
- android 内存溢出问题
- Android 内存溢出问题
- android 内存溢出问题
- Android 内存溢出问题
- Android内存溢出问题
- android内存溢出问题
- 切片字体兼容问题
- Hibernate的对象关系
- String,SringBuffer和 StringBuilder的区别
- Java中HashMap和HashTable的区别
- 在公司学到的知识(2)——TRUNCATE TABLE
- Android虚拟机(DVM)内存分配——内存溢出问题
- 一步步DIY: OSM-Web服务器(六) C/S架构客户端开发中的细节问题
- 一个测试引发的思考
- 创新工厂面试题详解:共打了多少鱼
- oracle useful sql
- debian 增加 nginx 自启动脚本
- LaTeX制作表格
- 用指针式万用表欧姆档检测发光二极管
- 将24位位图转换8位位图