转自: http://www.cnblogs.com/jacktu/archive/2010/12/30/1921475.html

大家都知道Android的上层应用是基于 Dalvik Virtual Machine的。Dalvik VM的特点是基于寄存器,相比SUN的JVM(基于堆栈,没有寄存器)来说,理论上完成同样的功能需要的指令条数少,但是指令集复杂。到了Android2.2,Dalvik终于实现了JIT(Just In Time)功能,前进了一大步。

近期我们遇到OutOfMemory的错误,通常是堆内存溢出。网上有些帖子说可以通过函数设置应用的HEAP SIZE来解决这个问题,其实是不对的。

dalvik.system.VMRuntime.getRuntime().setMinimumHeapSize(NewSize);
 
 
VMRuntime在2.2以上是隐藏api

堆(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其实只是改变了堆的下限值,它可以防止过于频繁的堆内存分配,当设置最小堆内存大小超过上限值时仍然采用堆的上限值,对于内存不足没什么作用。

setTargetHeapUtilization(float newTarget) 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。

最新文章

  1. word 2010 建立多级结构和目录
  2. [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
  3. Sublime Text 3 快捷键
  4. Java多线程系列--“JUC原子类”02之 AtomicLong原子类
  5. CF459E Pashmak and Graph (DP?
  6. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)
  7. 更改ubuntu下mysql的密码
  8. JavaScript NodeList和Array
  9. (转载)调用ob_end_flush()网页仍旧不能显示有关问题
  10. 上拉、下拉UITableView,交互式 模态弹出(自定义弹出动画)
  11. php调用dll
  12. 谈谈那些年PHP中屌屌的验证码
  13. Insertion Sort List Leetcode
  14. Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。
  15. 莫烦scikit-learn学习自修第四天【内置训练数据集】
  16. 制作根文件系统之内核如何启动init进程
  17. Java vs C++ (7)导入
  18. 安卓开发笔记——TabHost组件(二)(实现底部菜单导航)
  19. u-boot 2016.05 添加u-boot cmd
  20. Unity3d修炼之路:GUIbutton简单使用,完毕对一个简单对象Cube的移动,旋转

热门文章

  1. [Bash] Move and Copy Files and Folders with Bash
  2. 一天教你入门struts2
  3. VC++ 2010编译错误 fatal error C1189 error This file requires _WIN32_WINNT to be #defined at least
  4. string 是值类型,还是引用类型(.net)[转]
  5. IO流(字节流复制)01
  6. git clone新项目后如何拉取其他分支代码到本地
  7. 多媒体开发之---h264 server rtsp
  8. Oracle - 创建表视图等 - DDL
  9. HDU 2512 一卡通大冒险(dp)
  10. file结构体中private_data指针的疑惑【转】