首页 > 系统相关 >Android内存优化的背景

Android内存优化的背景

时间:2023-08-31 14:31:36浏览次数:42  
标签:Dalvik 代码 系统 内存 应用 Android 优化

一、Android内存管理机制

Android系统在运行时使用内存管理机制来分配和回收内存,以确保应用程序在合适的内存限制下运行,并优化系统资源的使用效率。Android系统中有不同类型的内存区域,每个区域都有不同的作用。

  1. Java堆(Java Heap):Java堆是用于分配Java对象的主要内存区域。Android应用程序中的大部分对象都在Java堆中分配和回收。Android的堆大小通常是通过-Xmx-Xms选项来指定的,它们分别定义了堆的最大和初始大小。
  2. 本地堆(Native Heap):本地堆是用于分配本地代码和库使用的内存区域。当应用程序中的代码涉及本地代码(如C/C++)或使用系统库时,会在本地堆中进行内存分配。本地堆不受Java堆大小的限制,但需要管理以避免内存泄漏和溢出。
  3. 栈(Stack):栈是用于管理方法调用和本地变量的内存区域。每个线程在运行时都有自己的栈,用于保存方法的调用和临时变量。栈的大小通常是通过虚拟机设置或操作系统设置进行控制。
  4. 常量池(Constant Pool):常量池是用于存储常量数据的内存区域,包括字符串、类和接口的常量。它位于Java堆中,与对象分配和回收一起进行管理。
  5. 寄存器(Registers):寄存器是位于处理器中的最快速度的内存区域。它用于存储计算和方法调用的临时数据。寄存器不受软件控制,由处理器自动分配和管理。

内存区域

Android系统通过垃圾回收(Garbage Collection)来回收未使用的内存,垃圾收集器会自动检测和释放不再使用的Java对象。Android系统还提供了内存管理工具和API,例如System.gc()方法和MemoryInfo类,开发者可以使用它们来优化内存使用,避免内存泄漏和溢出。

Android内存优化的背景_Java

垃圾回收

了解不同类型的内存区域和它们的作用对于开发者来说非常重要,可以帮助他们更好地管理和优化应用程序的内存使用,确保应用程序的性能和稳定性。

二、Android内存管理机制的优势

Android内存管理机制的优势主要体现在以下几个方面:

  • 提高应用切换和恢复的速度:Android系统通过分页和内存映射技术,实现了进程间的内存共享,使得一些通用的框架代码和资源可以在不同进程之间复用,而无需重新加载。同时,Android系统也通过保留一些常用应用的进程和状态,实现了进程的缓存,使得用户在切换应用时无需重新启动。这些技术可以大大提高应用切换和恢复的速度,提高用户体验。

以下是一个简单的示意图,说明了Android系统如何通过内存共享和进程缓存来提高应用切换和恢复的速度:

Android内存优化的背景_Android_02

应用切换和恢复示意图

Android内存优化的背景_Java_03

应用切换和恢复示意图

从图中可以看出,当用户从应用A切换到应用B时,Android系统不会立即销毁应用A的进程,而是将其放入后台,并保留其状态和数据。同时,由于应用A和应用B都使用了相同的框架代码和资源,Android系统可以通过内存映射技术让它们共享这些内容,而无需重新加载。当用户再次切换回应用A时,Android系统可以快速地从后台恢复应用A的进程,并恢复其状态和数据。这样,用户就可以无缝地在不同应用之间切换,而无需等待或者重新启动。

  • 减少应用启动时间:Android系统通过使用预链接技术,实现了对Dalvik代码和本地代码的优化,使得应用启动时无需进行动态链接库文件,而是直接从内存映射文件中加载。这种技术可以减少应用启动时间,提高应用性能。

以下是一个简单的示意图,说明了Android系统如何通过预链接技术来减少应用启动时间:

Android内存优化的背景_Android_04

预链接示意图

Android内存优化的背景_Java_05

预链接示意图

从图中可以看出,当用户安装一个新的应用时,Android系统会对该应用的Dalvik代码和本地代码进行预链接操作,即将它们转换为内存映射文件,并保存在/data/dalvik-cache目录下。当用户启动该应用时,Android系统不需要再进行动态链接库文件的加载和解析,而是直接从内存映射文件中读取代码,并执行。这样,用户就可以快速地启动该应用,而无需等待或者占用额外的内存空间。

  • 提高应用运行时性能:Android系统通过使用JIT编译器和ART运行时环境,实现了对应用代码的优化,使得应用运行时更快更省电。JIT编译器可以在运行时将Dalvik字节码转换为本地机器码,提高执行效率。ART运行时环境可以在安装时将Dalvik字节码转换为本地机器码,避免运行时开销。这些技术可以提高应用运行时性能,提高用户体验。

以下是一个简单的示意图,说明了Android系统如何通过JIT编译器和ART运行时环境来提高应用运行时性能:

Android内存优化的背景_内存优化_06

JIT和ART示意图1

Android内存优化的背景_Android_07

JIT和ART示意图2

从图中可以看出,当用户运行一个应用时,Android系统会根据应用的代码类型和系统的版本选择不同的运行时环境。如果应用的代码是Dalvik字节码,而系统的版本是Android 4.4以下,则Android系统会使用Dalvik虚拟机来执行该代码。如果应用的代码是Dalvik字节码,而系统的版本是Android 4.4以上,则Android系统会使用JIT编译器来优化该代码,即在运行时将Dalvik字节码转换为本地机器码,并缓存起来。如果应用的代码是Dalvik字节码,而系统的版本是Android 5.0以上,则Android系统会使用ART运行时环境来优化该代码,即在安装时将Dalvik字节码转换为本地机器码,并保存在/data/dalvik-cache目录下。这样,用户就可以享受更快更省电的应用运行体验,而无需担心兼容性或者性能问题。

三、Android内存管理机制的挑战

Android内存管理机制的挑战主要体现在以下几个方面:

  • 内存限制:Android系统为每个应用进程分配了一个有限大小的Dalvik堆空间,如果应用在达到堆容量上限后尝试分配更多内存,则可能会收到OutOfMemoryError异常。这种异常会导致应用崩溃或者无法正常工作。因此,开发者需要注意控制应用的内存占用量,避免创建不必要的对象或者使用更高效的数据结构和算法。
  • 内存泄漏:内存泄漏是指本来该被GC回收后还给系统的内存,并没有被GC回收。这种情况通常是由于对象引用没有正确释放造成的。例如,如果一个静态变量或者单例模式持有一个Activity或者Context对象的引用,则该对象及其关联的资源无法被GC回收,即使该Activity或者Context已经不再使用。这种情况会导致内存占用量不断增加,最终可能引发OutOfMemoryError异常或者影响其他应用的运行。
  • 内存抖动:内存抖动是指频繁创建和销毁对象导致GC频繁运行的现象。这种现象通常是由于在循环或者频繁调用的方法中创建临时对象造成的。例如,在一个动画或者音乐播放等密集型处理循环中,在每一帧期间创建多个对象,则会导致Dalvik堆中产生大量垃圾对象。这些垃圾对象会触发GC运行,而GC运行时会暂停应用的执行,导致应用出现卡顿或者延迟。这种情况会降低应用的性能和用户体验。
  • 内存溢出:内存溢出是指应用尝试分配的内存超过了系统可用的内存,导致系统无法为应用分配更多内存。这种情况通常是由于处理大量数据或者图形资源造成的。例如,如果应用需要加载一张高清图片或者一个大型视频文件,则可能会占用大量的内存空间。如果应用没有合理地处理这些数据或者资源,则可能会导致系统内存不足,引发OutOfMemoryError异常或者影响其他应用的运行。

以下是一个简单的示意图,说明了Android系统如何在不同情况下处理内存问题:

Android内存优化的背景_Java_08

内存问题示意图

从图中可以看出,当应用在正常情况下运行时,Android系统会通过GC来回收无用对象,并保持一定的空闲内存空间。当应用在异常情况下运行时,如遇到内存限制、内存泄漏、内存抖动或者内存溢出等问题,则Android系统会采取不同的措施来处理这些问题。例如,当应用遇到内存限制时,Android系统会尝试释放一些缓存或者共享的内存空间,并提示开发者优化代码;当应用遇到内存泄漏时,Android系统会尝试检测并报告泄漏源,并提示开发者修复代码;当应用遇到内存抖动时,Android系统会尝试减少GC的频率和开销,并提示开发者优化代码;当应用遇到内存溢出时,Android系统会尝试终止一些后台进程或者应用,并提示用户释放内存或者重启设备。


标签:Dalvik,代码,系统,内存,应用,Android,优化
From: https://blog.51cto.com/u_16175630/7307938

相关文章

  • 无涯教程-Android - EditText函数
    EditText是TextView的覆盖层,该覆盖层将自身配置为可编辑的。它是TextView的预定义子类,其中包含丰富的编辑功能。EditText-属性以下是与EditText控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。继承自android.......
  • svchost.exe占用内存过高--(windows update检查更新时一直处于正在检查)
    1.打开任务管理器-进程,找到svchost对应占用内存过高对应PID值例如:60982.打开任务管理器-服务,查找PID为6098的服务,如果是windowsupdate引起的则操作以下步骤 1)右击windowsupdate-属性设为停止 2)C:\windows\softwaredistribution删除里面......
  • Unity Android Studio 混合开发实践(Unity工程导入Android项目进行开发)
    前言最近接到一个任务是将一个unity开发的游戏接入到现有的Android项目里,然后在现有的App实现点击一个按钮打开游戏,并且在游戏内提供一个可以退出到App的按钮。整体需求是很明确的,难点主要有两个:我们公司是做应用开发的,没有任何游戏开发的技能储备。在游戏中需要和Native进行......
  • android短视频开发,js如何设置canvas绕图形中心旋转
    android短视频开发,js如何设置canvas绕图形中心旋转1.准备一个页面拟写一个页面,用于实验,代码如下 <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initcal-scale=1.0"/><title>......
  • 【备战金九银十】2023年最全Android岗1000+面试题及答案
    前言马上又准备迎接金九银十了,各大厂,国央企纷纷加入抢人大战竞争尤为激烈!但是,相比求职者来说岗位数量还不是很多,自然而然HR们就开始优中选优,激化“内卷”!如何在众多面试者中脱颖而出?对于很多程序员来说是目前最重要的事。因此本篇通过收集腾讯T4总结的2023年最全的Android岗面试......
  • 史上最全的Android教程安卓开发从基础入门到精通
    前言这几年老是有人在问,Android凉了没?Android开发还有没有发展前景?Android开发还值得入门吗?等等Android出现前几年的发展,前几年需求多,大量新的App项目,大小公司都缺Android开发人员,属于供不应求的状态。随着几年发展,这些年Android开发从业人员确实在增多,科班出身和培训出身的人越来......
  • 内存分区模型
    1内存分区模型C++程序在执行时,将内存大方向划分为4个区域代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量等堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收......
  • 无涯教程-Android - Activity
    Activity代表具有用户界面的单个屏幕,就像Java的窗口或框架一样。AndroidActivity是ContextThemeWrapper类的子类。如果您使用过C,C++或Java编程语言,那么您一定已经看到您的程序从main()函数开始。与之非常相似,Android系统以Activity来启动其程序,该程序以对onCreate()回调方......
  • 记录--解决前端内存泄漏:问题概览与实用解决方案
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助内存泄漏是前端开发中的一个常见问题,可能导致项目变得缓慢、不稳定甚至崩溃。在本文中,我们将深入探讨在JavaScript、Vue和React项目中可能导致内存泄漏的情况,并提供详细的代码示例,以帮助开发人员更好地理解和解决这......
  • 页面加载速度优化的12个建议
    1、合并Js文件和CSS将JS代码和CSS样式分别合并到一个共享的文件,这样不仅能简化代码,而且在执行JS文件的时候,如果JS文件比较多,就需要进行多次“Get”请求,延长加载速度,将JS文件合并在一起后,自然就减少了Get请求次数,提高了加载速度。2、Sprites图片技术Spriting是一种网页图片应用处理......