`

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 Dalvik 虚拟机

    Dalvik 虚拟机的特点——掌握 Android 程序的运行原理 Android 系统的架构采用分层思想,这样的好处是拥有减少各层之间的依赖性、便于独 立分发、容易收敛问题和错误等优点。Android 系统由 Linux 内核、函数库、...

    Android中Dalvik(DVM)的详解

    Android中Dalvik(DVM)的详解 Dalvik是Google公司自己设计用于Android平台的Java虚拟机

    百度Android工程师面试题.pdf

    1、 Android dvm 的进程和 Linux 的进程, 应用程序的进程是否为同一个概念 DVM 指 dalivk 的虚拟机。每一个 Android 应用程序都在它自己的进程中运行, 都拥有一个独立的 Dalvik 虚拟机实例。而每一个 DVM 都是在 ...

    Android期末复习题01

    4、下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是 ( ) DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中...

    Android背诵87题-总结.docx

    1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个...

    德莱尔DVM系列变频器说明书.pdf

    德莱尔DVM系列变频器说明书pdf,德莱尔DVM系列变频器说明书

    JVM DVM的区别

    JVM 与DVM 的区别

    DVM 1000A使用手册.pdf

    DVM 1000A使用手册pdf,DVM 1000A使用手册

    Aldec HES-DVM用户手册

    Aldec公司HES-DVM最新版本用户指南,含Release Note/User Guide/GUI Reference等

    ERP系统信息化资料:SAP专业教材资料DVM_10_38Ps.doc

    ERP系统信息化资料:SAP专业教材资料DVM_10_38Ps.doc

    dvm:感谢Vagrant和boot2docker,这是一个随需应变的Docker虚拟机。 在Mac和其他本机不支持Docker守护程序的平台上运行良好。 支持VirtualBox,VMware和Parallels

    dvm 感谢和 ,这是一个按需的虚拟机。 在Mac和其他本机不支持Docker守护程序的平台上运行良好。 在这是下载和引导Mitchell Hashimoto的映像。 诸如dvm之类的驱动需求是用于运行基础结构测试,例如使用 。 为了使驱动...

    零基础入门Android(安卓)逆向-rar

    34.Android dvm 脱壳3 H2 X- A# M4 s+ A6 K- b 35.Dalvik dex处理分析 ) x+ l1 l1 J R2 N) T" R) ^2 o 36.IDA脱壳脚本编写1) O7 `% E" Q. @1 X! o ~ 37.Odex修复方法 38.IDAOdex修复脚本编写 " X' w1 h: w3 N" u8 P5...

    东芝TC58DVM92A1FT00数据手册

    该文档是东芝公司的TC58DVM92A1FT00型号MOS芯片的数据手册,可以为开发人与提供相关帮助信息,有需要的童鞋可以下载哦~

    浅谈Android中关于静态变量(static)的使用问题

    静态变量在类被load的时候分配内存,并存在于方法区。当类被卸载时,静态变量被销毁。在PC机的客户端程序中,一个类被加载和卸载,可简单的等同于jvm进程的启动和结束。在Android中,用的DVM也是一样的,不过Android...

    java7hashmap源码-Android-Interview:Android面试题大全

    DVM指Dalivk的虚拟机,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalivk虚拟机实例。而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。 SIM卡的 EF 文件有何作用? sim卡的...

    Android招聘面试题解答

    Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念?DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程...

    simple-dvm:一个简化的教育 Dalvik 虚拟机实现

    这是一个从头开始编写的简化 Dalvik 虚拟机实现,用于教育目的。 simple-dvm旨在能够运行类似 Dhrystone 的 Java 基准测试。如何建造make (可选)验证实现: make check如何跑步获取 Dhrystone 基准的 DEX 文件: ...

    Android5.1 Art Hook

    Android5.1 Art Hook 支持4.0到5.1的dvm和art hook。美中不足是编写hook函数比较麻烦

    cvte面试题里面包含了许多CVTE面试的真是题目,非常的有用

    Android 运行环境和 Dalvik 虚拟机 一、Android 运行环境 Android 运行环境主要指的是 Dalvik 虚拟机技术,所有 Java 程序都是运行在 Dalvik VM 上的。每个 Android 应用程序都有自己的线程,DVM 只执行.dex 的 ...

    android笔试题目汇总及答案

    android笔试题目汇总及答案: 1.关于线程下面描述错误的是:( D ) A. 如果线程处于死亡状态,则它不是Runnable线程 B. 线程可以将控制权交给较低优先级的线程 C. 在Java中,较高优先级的Runnable线程应抢在较低...

Global site tag (gtag.js) - Google Analytics