`

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虚拟机结构及机制剖析 第2卷.pdf

    但我可以根据标题所揭示的主题,即“Android Dalvik虚拟机结构及机制剖析”,来生成相关的知识点。 Dalvik是Android操作系统中用于执行应用程序的虚拟机。它专为移动设备优化,使得Android应用能够高效运行。Dalvik...

    Android应用源码之防止内存溢出浅析-IT计算机-毕业设计.zip

    本文将深入浅出地分析Android应用源码中如何预防内存溢出问题,帮助开发者提升应用性能和稳定性。 一、Android内存管理基础 Android系统采用Dalvik虚拟机(Dalvik Virtual Machine,DVM)进行应用执行,每个应用都...

    Android Dalvik虚拟机的启动过程源码分析

    在深入探讨Dalvik虚拟机(Dalvik Virtual Machine, DVM)的启动过程之前,我们需要了解DVM的基本概念及其在Android系统中的作用。DVM是Android操作系统中运行应用程序的核心组件之一,负责执行已编译好的.dex文件。...

    Android中Dalvik(DVM)的详解

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

    JVM DVM的区别

    - 为了避免与Oracle的版权纠纷,谷歌选择开发出自己的虚拟机——DVM。 - DVM不仅解决了潜在的版权问题,还根据移动设备的特点进行了优化。 2. **平台适应性**: - DVM特别针对移动设备进行了优化,尤其是在内存...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY[文].pdf

    在Android开发中,我们经常会遇到内存管理的问题,特别是与Bitmap相关的内存溢出(Out Of Memory,简称OOM)问题。Bitmap对象是Android系统中用于处理图像数据的重要类,但由于其消耗大量的内存,不当使用可能导致...

    百度Android工程师面试题.pdf

    Android应用程序的运行基于Dalvik虚拟机(DVM),每个应用都在其独立的进程中运行,具有单独的DVM实例。DVM是在Linux内核中作为一个进程存在的,因此可以说Android应用进程与Linux进程在概念上是相同的。 2. **SIM...

    2022年Android开发工程师面试题最新整理.docx

    1. **Android DVM与Linux进程**:Android应用运行在Dalvik虚拟机(DVM)中,每个应用都有自己的DVM实例,这对应于Linux中的一个进程。DVM是专门为Android设计的轻量级虚拟机,使得每个应用可以在隔离的环境中运行。 ...

    Dalvik虚拟机架构

    随着Android平台的兴起与发展,越来越多的应用程序开发者开始关注其核心组件之一——Dalvik虚拟机(Dalvik Virtual Machine, DVM)。不同于传统的Java虚拟机(Java Virtual Machine, JVM),DVM是专门为移动设备设计...

    android面试问题

    每个Android应用在运行时都有自己的Dalvik虚拟机实例(DVM),这使得每个应用都仿佛在独立的环境中运行,隔离了应用程序之间的相互影响。Dalvik虚拟机是专门为Android设计的,它采用了Just-In-Time(JIT)编译技术,...

    2014年android面试题目及其答案大全

    它们均利用MMU(Memory Management Unit)进行地址转换,创建虚拟内存空间,确保高效、安全的内存分配和访问。 4. **嵌入式实时操作系统与Android** 嵌入式实时操作系统(RTOS)强调对外部事件的快速响应能力。...

    android面试——面霸经历(增加java基础)

    - Android程序是在Android平台上运行,使用Dalvik虚拟机(DVM)。 - **编程框架**: - Java程序通常使用标准Java库。 - Android程序使用Android SDK提供的API,这些API针对移动设备进行了优化。 **7. Task任务栈的...

    android面试题大全及答案

    - DVM(Dalvik虚拟机)是Android系统中运行应用程序的虚拟机。每个Android应用在各自的进程中运行,都有一个独立的DVM实例。而在Linux操作系统中,这些DVM实例对应为单独的进程,所以可以说DVM进程与Linux进程是同...

    Android嵌入式系统架构及内核浅析

    - **Dalvik Virtual Machine (DVM)**:这是一个专门为Android设计的虚拟机,用于执行应用程序中的.dex格式的字节码文件。 - **Core Libraries**:这些核心库包含了一系列的标准Java库,以及一些专为Android设计的...

    百度android开发面试题

    在Android环境中,DVM(Dalvik虚拟机)是为Android平台设计的虚拟机,每个Android应用都在其自己的进程中运行,并拥有独立的DVM实例。这意呸着每个应用都有自己的运行环境,相互隔离,保证了系统的稳定性和安全性。...

    Android面试题1

    它们都利用MMU(Memory Management Unit)来实现虚拟内存到物理内存的映射,以优化内存分配和访问效率。 4. **嵌入式实时操作系统**: 实时操作系统(RTOS)强调响应速度和确定性,分为软实时和硬实时。Android...

Global site tag (gtag.js) - Google Analytics