深入研究Android内存

news2024/11/28 14:49:37

深入研究Android内存

Android应用程序开发时,我们始终意识到自己是Android硬件和操作系统的一部分。

从硬件角度来看,我们可以将Android手机分为不同级别。基本上,我们可以将它们分类为适用于低端硬件或API的入门级、中级和高级硬件-API手机。在开发应用程序时,以适用于低级硬件或API的水平进行开发意味着吸引更多的用户。

随着时间的推移,我们倾向于将越来越多的功能和技术集成到我们的应用程序中,这意味着随着时间的推移增加了代码维护工作量,并对硬件内存等提出了更高的要求。

Android操作系统的工作原则是未使用或空闲的内存是浪费的内存。它始终试图以优化的方式利用所有可用空间来满足需求。如果有足够的空间,系统在应用程序关闭或置于后台后仍然保留内存。当用户再次打开应用程序时,它会更快地启动。这就是为什么大多数Android设备只剩下很少的可用空间的原因。

软件需要通过访问来使用内存。通常,这是通过Linux内核和驱动程序实现的。然后,应用程序通过驱动程序提供的接口进行通信。内存可以分为虚拟内存和物理内存。CPU使用Memory Management来管理RAM。

开发者Android内存类型

Android操作系统共享RAM页面以适应其在RAM中所需的所有内容。每个应用程序进程在系统启动时分叉Zygote并启动,当通用框架代码加载时。这种方法允许框架源代码在大多数RAM页面之间共享。

Android设备包括RAM-zRam和存储。

  • RAM:大小有限。速度最快的内存类型。
  • zRam:用于短期情况的RAM部分。所有数据在移入和移出zRam时都会被压缩,并在复制时解压缩。
  • 存储:包含持久数据。它包含应用程序、库和平台文件等数据。
    如果没有足够的内存,Android操作系统会采取各种预防措施。让我们考虑一个场景,多个应用程序在后台运行。Android操作系统在系统中分阶段激活垃圾收集-kswapd和低内存杀手。

垃圾收集

基本上,它有两个重要任务。

  • 查找程序中将来无法访问的对象
  • 使系统能够回收不可访问对象使用的资源

操作系统跟踪内存的每个分配区域,并在那里管理操作。ART和Dalvik类似。内存根据对象的大小和持续时间以及其持续时间的长短进行分类和管理。
Oracle JVM垃圾收集基础知识

在第一阶段,对象被转移到Young阶段,然后转移到Old-Permanent阶段。每个对象在内存中都有一个上限。当Generation开始填满时,Android操作系统运行垃圾收集。GC运行时间因活动对象的数量和大小而异。大多数时候,GC由系统管理。有方法可以干预这个过程,但不建议这样做。

Kswapd(内核交换守护进程)

Android操作系统使用内存映射页进行工作。每个页面对应大约4kb。页面可以被归类为缓存、已使用和空闲。页面可以被分类为Clean和Dirty。

  • Clean:内存中文件的未修改副本。
  • Dirty:内存中文件的修改副本。

未使用的页面是RAM的空闲部分。正在使用的页面指的是活动使用的RAM。

可以删除Clean页面,因为它们可以始终使用数据重新创建。但是,不能删除Dirty页面,否则修改的数据将丢失。

Kswapd是Linux内核的一部分,它将已使用的内存转换为可用内存。当内存达到一定水平时,它会被触发。Kswapd开始回收内存。当有足够的空间可用时,回收过程停止。通过删除页面或将其移动到zRam进行压缩来回收内存。
开发Android

低内存杀手(Low Memory Killer)

尽管采取了预防措施,但如果无法获得足够的内存空间,就会调用它。系统使用onTrimMemory方法通知应用程序内存即将耗尽,应减少分配。如果还不够,就会激活低内存杀手。它开始根据特定评分系统停止进程。
Android低内存杀手

LMK从表格顶部向下开始终止进程。设备制造商可以更改LMK的行为。让我们在一个完整的场景中看看这些例子。

在低端设备上,当用户逐渐开始使用多个应用程序时,垃圾收集器会在接近应用程序使用的内存限制时开始运行。当Android操作系统达到Kswapd阈值时,页面会被移动到zRam并进行压缩或清理以释放内存空间。在Kswapd无法应付的情况下,低内存杀手会开始终止应用程序。

这种情况对用户来说是不可取和不利的。假设用户正在使用应用程序X。在内存使用率高时,他将其放在后台并切换到应用程序Y。如果在此期间关闭了应用程序X,当他再次打开该应用程序时,他将等待一个明显的时间。这意味着在重要事务存在时,对用户来说是时间和数据的损失。

内存管理

我们的应用程序使用过多内存可能会有很多原因。导致内存泄漏的情况、库的选择、创建过多嵌套或执行大型操作的即时对象等。可以使用Android Studio中的Memory Profiler或Perfetto等监控工具来检测和调试这些问题。

  • 内存泄漏:防止垃圾收集检测和回收未使用的对象。因此,它使我们的内存使用率低于100%。
  • 库选择:应用程序中使用的库对应用程序有一定的负载,从编译或运行时执行到它们使用的方法。
  • 应用程序大小:我们放置在应用程序中的所有内容(例如使用PNG而不是SVG等)都会影响应用程序的大小。减小APK大小可以显著降低内存使用量。
  • 基于工厂:在代码复杂度高、存在过多对象或进行大量操作的区域,可以考虑使用工厂结构。
  • 对象池:如果应用程序中重复使用相同类型的对象,则可以使用对象池。当对象不使用并将被销毁时,如果将来需要再次使用它,则可以从池中获取,而不是在需要时重新创建。这需要良好的同步和使用。

许多外部因素会影响Android应用程序的内存使用情况。即使在同一设备的不同API级别或不同的应用程序和权限中,使用情况可能会有所不同。为此,应该对系统进行良好的监控和测试。重要的是要注意应用程序的内存和生命周期,并以最大限度减少数据丢失的方式进行开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1176991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python+Selenium WebUI自动化框架 -- 基础操作封装

前言: 封装Selenium基本操作,让所有页面操作一键调用,让UI自动化框架脱离高成本、低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试小白都能编写并实现自动化。 知识储备前提&a…

WordPress自适应图片主题源码CX-UDY主题模板 带会员积分下载系统

说明:该主题只适用于WordPress 4.8及以下版本,高版本暂不支持,介意的请勿下! 下载地址 qnziyw点cn/cmsmb/wordpress/8084点html

Flutter:安装依赖报错doesn‘t support null safety

项目中需要引用http依赖,在pubspec.yaml文件中添加如下信息: 当同步时,报错信息如下: [myflutter] flutter pub upgrade Resolving dependencies... The current Dart SDK version is 3.1.3. Because myflutter depends on http &…

超简单的Mac双开微信,升级后失败重复操作仍然有效

首先找到安装的微信 应用程序 -> 微信 右键 -> 复制 复制出来效果如下: 在复制出来的微信应用右键-> 点击显示包内容 但是每次打开微信都特别麻烦,这里选择脚本右键制作替身,最后多出来的替身图标,拖拽到桌面就可以了…

6.数据类型与运算符

目录 mysql数据类型 整型数据类型 浮点数类型和定点数类型 1、日期时间类型 1、YEAR 2、TIME 3、DATE类型 4、DATETIME 5、TIMESTAMP 2、字符串类型 1、CHAR 和 VARCHAR类型: 2、TEXT类型 3、ENUM类型 4、SET类型 二进制字符串类型 1、BIT类型 2、…

Java学习 7.Java-方法的使用

一、为什么要使用方法 在编程中,某段功能的代码可能频繁使用,如果在某个位置重新实现一遍,会: 1.使程序变得繁琐 2.开发效率底下,做了大量重复性工作 3.不利于维护,需要改动时,所有用到该段…

Flink SQL DataGen Connector 示例

Flink SQL DataGen Connector 示例 1、概述 使用 Flink SQL DataGen Connector,可以快速地生成符合规则的测试数据,可以在不依赖真实数据的情况下进行开发和测试。 2、使用示例 创建一个名为 “users” 的表,包含 6 个字段:id…

智能井盖生产商家,万宾科技井盖传感器产品详情

市政府管理水平决定城市人民幸福程度,所以在智慧城市推进过程中,市政府也在加快城市信息基础设施建设,希望提高公共服务水平,以此来满足城市居民的需求,进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…

Docker学习——④

文章目录 1、Docker Image(镜像)2、镜像命令详解2.1 docker rmi2.2 docker save2.3 docker load2.4 docker image inspect2.5 docker history2.6 docker image prune 3、镜像综合实战3.1 离线镜像迁移3.2 镜像存储的压缩与共享 1、Docker Image&#xff…

第七章《搞懂算法:线性回归是怎么回事》笔记

线性回归算法是机器学习算法中最简单的一类,线性回归算法主要用于连续值的预测问题。 7.1 什么是线性回归 这种刻画了不同变量之间关系的模型叫作回归模型,如果这个模型是线性的,则为线性回归模型。 线性回归主要是应用回归分析来确定两种…

webgoat-Path traversal

Path traversal 路径(目录)遍历是一种漏洞,攻击者能够访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件,如果是文件,则会导致读取文件 上传覆盖关键系统文件。 它是如何工作的&#…

京东数据分析:2023年9月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台9月份打印机市场销售数据已出炉! 鲸参谋数据显示,今年9月,京东平台打印机的销量为60万,环比增长约32%,同比下滑约25%;销售额为5亿,环比增长约35%,同比下滑约29%…

“掌握高效图片管理:轻松成为图像处理达人!“

您是否曾经为找不到合适的图片而烦恼?或者因为无法批量处理图片而感到困扰?现在,我们为您带来了一款全新的图像管理工具,让您轻松实现批量图片处理,变身为图像管理达人! 第一步,首先我们要进入首…

Windows桌面便签工具推荐使用哪一款?

电脑桌面上张贴便利贴可以将近期需要完成的工作计划逐一添加到便利贴中,电脑桌面悬挂便利贴工具可以督促日常各项事务的完成。当前可悬挂在电脑桌面上的便利贴工具是比较多的,其中桌面小工具便签软件敬业签可满足各行业的办公需求。 建议大家在Windows桌…

软件测试从0offer到20k,你只差银行测试这一步!!!

金融类软件测试 举个栗子,银行里的软件测试工程师。横向跟互联网公司里的测试来说,薪资相对稳定,加班少甚至基本没有,业务稳定。实在是测试类岗位中的香饽饽! 一、什么是金融行业 金融业是指经营金融商品的特殊行业&am…

【笔记】系统集成项目管理工程师-各管理输入输出整理

目录 一、整体管理 二、范围管理 三、进度管理 四、成本管理 五、质量管理 六、人力资源管理 七、干系人管理 八、风险管理 九、word 版本整理 十、PPT图版本管理 一、整体管理 1. 制订项目章程 2. 制订项目管理计划 3. 指导与管理项目工作 4. 监控项目工作 5. 实施…

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

什么是组合逻辑环路? 组合逻辑环路(Combinational Loops):指组合逻辑的输出信号不经过任何时序逻辑电路(FF等),而直接反馈到输入节点,从而构成的电路环路。 此外,如果直接…

云计算的大模型之争,亚马逊云科技落后了?

文丨智能相对论 作者丨沈浪 “OpenAI使用了Azure的智能云服务”——在过去的半年,这几乎成为了微软智能云最好的广告词。 正所谓“水涨船高”,凭借OpenAI旗下的ChatGPT在全球范围内爆发,微软趁势拉了一波自家的云计算业务。2023年二季度&a…

SSL证书加密是什么?加密原理和过程是怎样的?

随着互联网的普及和发展,人们的日常生活与网络密切交织在一起。然而,由于网络通信的开放性,信息在传输过程中很容易被窃取、篡改或伪造,因此保护用户的隐私和数据安全显得尤为重要。SSL证书加密就是一种用于保护网络通信安全的技术…

代码随想录算法训练营第13天|239. 滑动窗口最大值 347. 前 K 个高频元素

239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-…