概念:CPU、内存、磁盘、Android内存分配
cpu
CPU的全称是Central Processing Unit,中文名称为中央处理单元。它是计算机硬件的核心部件,负责解释计算机程序指令并处理计算机软件中的数据。简言之,CPU执行计算机程序中的操作指令,包括基本算术、逻辑、控制和输入/输出(I/O)操作指令。
CPU的主要组成部分通常包括:
算术逻辑单元(ALU):执行数学运算和逻辑操作。
控制单元(CU):解释程序指令并控制其他硬件组件响应这些指令。
寄存器:提供存储CPU正在处理的指令和数据的极小但非常快速的内存。
随着技术的发展,现代CPU采用多核心设计,其中每个核心可以独立执行指令,提高了处理速度和效率。此外,一些CPU还集成了其他功能,如图形处理单元(GPU)和缓存存储器,进一步提高了性能。
CPU的性能受多种因素影响,包括其时钟速度(以GHz或MHz计量)、核心数量、缓存大小、指令集类型以及制程技术等。在计算机体系结构中,CPU执行的每个指令周期通常涉及取指令、解码、执行和写回等步骤。
在广义上,CPU可以出现在不同种类的设备中,包括个人计算机、服务器、移动设备、嵌入式系统等。
内存(RAM):
RAM的全称是Random Access Memory,中文意思是随机存取存储器。
内存是一种易失性存储设备,意味着当电源关闭时,它里面存储的所有信息会丢失。
内存用于存储当前运行的程序和程序需要立即访问的数据。
它的访问速度非常快,可以快速读写,是CPU直接访问数据和运行程序的地方。
磁盘存储(硬盘或固态硬盘):
磁盘存储是持久性存储设备,数据在没有电源的情况下也能被保存。
它用来长期存储数据,比如操作系统、应用程序文件、用户文档等。
磁盘的访问速度通常比内存慢,但它们提供了更大的存储容量。
CPU 和内存之间的关系
CPU(中央处理单元)和内存(主要指随机访问存储器,RAM)是计算机的两个核心组件,它们之间的关系至关重要,共同负责处理和执行计算任务。
以下是CPU和内存之间的关系和互动方式:
存储程序概念
现代计算机基于存储程序概念,即指令和数据都存储在内存中。CPU执行指令时,首先需要从内存中读取指令和数据,然后进行处理。处理完成后,CPU会将结果写回内存。
数据交换
CPU和内存之间不断交换数据。CPU通过数据总线从内存读取数据和指令,处理后可能会立即使用结果或者将结果存储回内存。
速度差异
CPU的速度通常远高于内存的速度。为了弥补这种速度差异,计算机使用缓存(Cache)存储最近使用的数据。缓存是一种小容量但极高速的内存,位于CPU芯片上或者非常靠近CPU,这样可以减少CPU等待数据的时间。
运行程序
运行程序时,操作系统负责将程序的代码和数据加载到内存中。CPU从内存中获取这些代码和数据,进行解码和执行。
存储结构
内存是分层次的存储结构。除了RAM,还有寄存器(CPU内部、访问速度最快的存储单元)、一级和二级缓存、磁盘存储等。CPU在执行程序指令时,会利用这些层次结构、以及相关的硬件和算法,优化数据的检索和处理过程。
内存管理
CPU含有内存管理单元(MMU),它负责虚拟内存和物理内存之间的映射。它保证每个应用程序能得到足够的虚拟内存地址,并且为它们分配实际的物理内存空间。
同步
CPU和内存需保证同步,以确保数据的正确性。其中使用到的机制有内存屏障(Memory Barriers)、锁(Locks)以及其他同步指令。
总之,CPU是执行指令和处理数据的地方,而内存是存储运行中程序的指令和数据的地方。CPU利用其内部的计算核心来执行运算和逻辑操作,内存则按照CPU的请求提供指令和数据。两者的良好协同工作对于提高计算机的性能至关重要。
Android内存分配
当一个Android应用启动时,Android操作系统会给它分配一定量的内存,这个过程是由Android运行时环境管理的。每个应用运行在它自己的沙盒环境中,拥有独立的内存空间,这样可以保障应用之间的安全性和隔离性。
应用的内存主要分为几个部分:
堆内存:这是应用存储动态分配的对象的地方。每个应用都有一个堆内存限制,这个限制取决于设备的内存大小和系统的当前状态。
原生堆内存:用于存储由原生代码分配的内存,比如使用NDK开发的应用或库。
代码内存:存储应用的代码和其他可执行文件。
栈内存:用于线程执行,存儲函数调用的参数和局部变量。
Android系统会监视每个应用使用的内存量,并通过一个称为低内存杀手(Low Memory Killer)的机制,在系统内存不足的情况下回收内存。处于后台的应用更有可能被杀掉来回收其占用的内存。
Android虚拟机运行在内存上
确实,Android虚拟机(如Dalvik虚拟机或ART:Android Runtime)运行在设备的内存中。它负责执行编译后的应用程序代码(DEX文件),并提供垃圾收集、内存分配、线程管理等运行时功能。
当应用程序运行时,它的DEX文件被加载到内存中,虚拟机会解释和执行这些代码。同时,虚拟机还要负责将这些代码里的对象和数据存储在堆内存中,并管理它们的生命周期。
总结来说,Android虚拟机是一个软件层,它运行在操作系统之上,负责管理应用的代码执行和内存分配。内存(RAM)是存储当前正在使用的信息的设备,它和磁盘存储(用于长期存储)是不同的。应用的内存分配由Android运行时环境进行管理,以保证应用运行效率和系统稳定性。
为什么在Android设备上容易发生OOM
有限的RAM: 相较于存储空间,RAM相对较小。许多中低端Android设备尤其容易因为有限的RAM(例如2GB或4GB)而面临内存不足的情况。
多任务: Android系统同时运行多个应用程序和后台服务。每个应用程序和服务都需要占用一定的RAM,多任务运行会大量消耗可用内存。
应用程序内存管理: 并非所有应用程序都优化了它们的内存使用。一些应用可能因为保留太多不再需要的数据,或是因为内存泄漏(即应用程序未能释放不再使用的内存),而导致过度占用内存。
大媒体文件: 图像、视频和其他媒体文件尤其是在高分辨率处理时,会消耗大量RAM。例如,加载和处理高分辨率图片时,可能需要为每个像素分配内存,这会迅速消耗可用内存资源。
如何应对内存溢出
优化应用程序: 应用开发者需要优化内存使用,例如通过有效的内存管理和清理,避免保留不需要的对象引用,使用内存友好的数据结构和算法。
减少并发运行的应用: 用户可以通过关闭不需要的应用以释放RAM。
使用相应的内存优化工具和库: 开发者可以使用Android Studio的Profile工具来监视和优化应用的内存使用,以及利用Android框架提供的各种内存优化和图片加载库(如Glide、Picasso)来减少内存占用。
内存分页和压缩: 一些Android设备可能会使用内存分页(Swapping)和压缩技术来扩展可用的RAM容量,尽管这样做会增加CPU的负担,可能导致系统在内存非常紧张时运行较慢。
总而言之,内存管理在确保Android设备性能的同时,也是维持良好用户体验的关键。无论是开发者优化他们的应用程序以减轻内存负担,还是用户通过管理运行应用的方式来节约内存,这些都是确保设备流畅运行的有效方式。
相关文章:
概念:CPU、内存、磁盘、Android内存分配
cpu CPU的全称是Central Processing Unit,中文名称为中央处理单元。它是计算机硬件的核心部件,负责解释计算机程序指令并处理计算机软件中的数据。简言之,CPU执行计算机程序中的操作指令,包括基本算术、逻辑、控制和输入/输出&am…...
Vue 图片加载失败显示默认图片
方法一:通过onerror属性加载默认图片 <img :src"img" :onerror"defaultImg" /><script> export default {data() {return {img: , // 访问图片的ip地址defaultImg: this.src ${require(/assets/images/right/default-person.png)…...

【Sentinel的限流使用】⭐️SpringBoot整合Sentinel实现Api的限流
目录 前言 一、Sentinel下载 二、SpringBoot 整合 Sentinel 三、流控规则 章末 前言 小伙伴们大家好,上次使用OpenFeign时用到了 Hystrix实现熔断和限流的功能,但是发现该工具已经停止维护了,于是想到了Spring Cloud Alibaba开发的Sentin…...

【示例】MySQL-SQL语句优化
前言 本文主要讲述不同SQL语句的优化策略。 SQL | DML语句 insert语句 插入数据的时候,改为批量插入 插入数据的时候,按照主键顺序插入 大批量插入数据的时候(百万),用load指令,从本地文件载入&#x…...
QT 线程的使用
1.头文件: #include<QThread> 2.在.h文件中定义全局: QThread* threadTraj; void threadTrajProcess();//回调函数 3.在.cpp文件中: threadTraj new QThread();//初始化 //连接槽函数 QObject::connect(threadTraj, &QThre…...

Python基于flask的豆瓣电影分析可视化系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

【迅为iTOP-4412-linux 系统制作(4)】ADB 或者 TF 卡烧写测试
准备工作 编译生成的内核镜像uImage 和设备树 dtb 文件“exynos4412-itop-elite.dtb”已经可以使用了。 把编译生成的uimage和dtb文件。拷贝fastboot工具。官方的u-boot-iTOP-4412.bin 也拷贝到 platform-tools 文件夹目录内。system.img 也拷贝到 platform-tools 文件夹目录…...
阿里云对象存储OSS批量上传,单个上传,批量删除,单个删除!
请自行替换秘钥: #阿里云 OSS src/main/resources/application.properties #不同的服务器,地址不同 aliyun.oss.file.endpointhttps://oss-cn-hangzhou.aliyuncs.com aliyun.oss.file.accessKeyIdLTAI5t9wUqCoD42qPGRy8S aliyun.oss.file.accessKeySecre…...

Python的国际化和本地化【第162篇—国际化和本地化】
👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 随着全球化的发展,多语言支持在软件开发中变得越来越重要。Python作为一种流行的…...
播放Samba协议下的音视频文件
Samba(也被称为SMB/CIFS)是一个用于在局域网内共享文件和打印服务的协议,广泛应用于Windows和Linux系统之间的文件共享。 一、展示Samba服务器下的文件 使用如jcifs这样的Java库来在安卓应用中集成SMB/CIFS客户端功能。这个库提供了与SMB/CI…...

Excel全套213集教程
Excel全套213集教程 包含技术入门93集 图表17集 数据透视35集 公式函数68 基础入门 93节 https://www.alipan.com/s/cMxuPstkS1x 提取码: 77dd 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视…...

【七 (1)指标体系建设-构建高效的故障管理指标体系】
目录 文章导航一、故障概述1、故障:2、故障管理: 二、指标体系概述1、指标2、指标体系 三、指标体系构建难点1、管理视角2、业务视角3、技术视角 四、指标体系构建原则1、与战略目标对齐2、综合和平衡3、数据可获得性4、可操作性5、具体和可衡量6、参与和…...

Go gin框架(详细版)
目录 0. 为什么会有Go 1. 环境搭建 2. 单-请求&&返回-样例 3. RESTful API 3.1 首先什么是RESTful API 3.2 Gin框架支持RESTful API的开发 4. 返回前端代码 go.main index.html 5. 添加静态文件 main.go 改动的地方 index.html 改动的地方 style.css 改动…...

Git分布式版本控制系统——Git常用命令(二)
五、Git常用命令————分支操作 同一个仓库可以有多个分支,各个分支相互独立,互不干扰 分支的相关命令,具体如下: git branch 查看分支 git branch [name] 创建分支&#x…...

LeetCode 59.螺旋矩阵II
LeetCode 59.螺旋矩阵II 1、题目 力扣题目链接:59. 螺旋矩阵 II - 力扣(LeetCode) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1࿱…...

03-JAVA设计模式-适配器模式
适配器模式 设么是适配器模式 它属于结构型模式,主要用于将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。 适配器模式主要解决的是不兼容接口的问题。在软件开发中,经常会有这…...

MVVM架构模式
目录 MVVM 数据绑定方式 实现方式 Model View ViewModel 数据绑定方式 vue:: 数据劫持和发布-订阅模式: Object.defineProperty() 方法来劫持(监控)各属性的 getter 、setter ,并在数据(对…...
leetcode2924--找到冠军II
1. 题意 给定一个有向无环图,方向表示胜负关系;求最后胜出的人。 2. 题解 将所有人标记为胜者,统计出度去掉对应胜者标记; 最后统计胜者数目,是否大于1,若大于1,则没有胜者,否则…...

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟
系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…...

统一用安卓Studio修改项目包名
可以逃跑,可以哭泣,但不可以放弃 --《鬼灭之刃》 修改项目包名 1)选中项目中药修改的包名: 2)目结构显示方式,取消 Compact Middle Packages 选项; 3)右键要修改的包名,选择 Refactor —— Re…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...