浅谈安卓系统内存运行机制

Android:安卓虚拟机(Dalvik && ART)学习 Android虚拟机特定学习 阅读详情

一、Android系统性能提升之路

 

Dalvik虚拟机作为Android平台的核心组成部分之一,允许在有限的内存资源中同时运行多个虚拟机实例。Dalvik虚拟机通过以下方式提升性能:

1、DEX代码安装时或第一次动态加载时odex化处理。

2、Android2.2版本提供了JIT机制提升性能,号称性能提升3~5倍。

3、提升硬件配置,如更多核CPU、更高频率CPU、更大的RAM等。

 

但是Android的系统流畅度与IOS系统还是有一定得差距。Android代码必须运行在Dalvik虚拟机上,而IOS直接是本地代码,性能差距也在情理之中。如果Android系统想拥有与IOS系统相同的系统性能。Dalvik虚拟机运行机制就成为Android系统性能提升唯一的障碍。

Android Kitkat 提供了一种与Dalvik截然不同的运行环境-ART(Android Runtime)的支持。目前用户可以选择设备的运行环境,在不久的将来ART肯定会替代Dalvik Runtime。

 

二、Dalvik vs ART


Dalvik运行环境使用JIT(Just-In-Time)来进行转译,应用每次运行的时候,字节码都需要通过JIT转换为机器码,这会拖慢应用的运行效率。而ART则是使用AOT进行处理(Ahead-Of-Time),并会在应用程序安装完毕时,进行预先的基础性编译作业,这就减去了JIT运行时的机器码转化时间,应用的启动和执行都会变得更加快速。

ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。

4、支持更低的硬件。

ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。

 

总的来说ART的功效就是“空间换时间”。

 

三、初步感知ART

 

1、设备如何选择ART运行环境

 

通过以下步骤开启:设置→关于手机→点击最下面的版本号7次→开发者模式出现→返回→进入开发者模式,然后选择runtime-使用ART

目前官方Android模拟器并不能开启ART模式,可以通过该网址下载支持ART模式的Android模拟器镜像 ( https://blog.youkuaiyun.com/coolypf/article/details/17069015)

 

2、Dalvik切换ART后系统变化

 

2.1、应用安装时采用的代码优化方式不同:

Dalvik Runtime : dex2opt(https://124.16.139.131:24080/lxr/source/dalvik/dexopt/OptMain.cpp?v=android-4.0.4#f_OptMain.cpp)

ART Runtime : dex2oat (https://android.googlesource.com/platform/art/+/kitkat-release/dex2oat/dex2oat.cc)

/

 

2.2、优化后的文件大小及格式不同:

两个运行环境产生的优化代码路径及文件名都为:/data/dalvik-cache/app/data@app@{package name}.apk@classes.dex

ART环境产生的优化代码文件大小明显比Dalvik环境产生大:

/

 

虽然都为.dex文件结尾,但是文件格式却是天壤之别:

ART环境文件格式:ELF Shared Object

/

 

Dalvik环境文件格式:

/

 

三、ART相关源代码

 

ART相关源代码下载地址:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz)

从源代码文件目录名称可以很清楚的了解各文件夹中相关文件的功能,我们最关心的主要有compiler、dex2oat、runtime三个文件夹:

compiler:主要负责Dalvik字节码到本地代码的转换,编译为libart-compiler.so

dex2oat :完成DEX文件到ELF文件转换。编译为dex2oat

runtime :Android ART运行时源代码,编译为libart.so

/

 

四、dex2oat优化流程

 

在应用安装时,installd通过dex2oat优化APK安装包classes.dex的Dalvik字节码为本地机器代码。整个优化为:

 

/

 

 

更多LLVM编译器的信息可查看:

https://llvm.org/

https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/

https://www.chinaicexpo.com/market/1104-llvm.html

 

五、OAT文件格式

 

OAT文件其实就是基于ELF格式的一种私有文件格式。

 

OAT的ELF 段信息:

/

 

OAT的ELF export信息:

/

 

OAT文件加载流程,通过分析ART相关源码,当通过DexClassLoader加载一个OAT文件基本流程如下:

1、读取oatdata符号地址获取Oat数据 startAddress。

2、读取oatlastword符号地址获取OAT数据 endAddress。

3、通过startAddress和endAddress定位Oat数据。

4、解析Oat数据。构建方法定位所需数据结构。

然后就可以调用加载OAT文件的代码了。

 

整个的方法定位过程和Dalvik运行环境没有太大区别,读者可以通过(https://blog.youkuaiyun.com/androidsecurity/article/details/8664778)来了解如何定位到一个类的某个方法。

您可以简单的认为ART和Dalvik区别就是:Dalvik定位到的方法是Davlik字节码,但是ART定位到的方法是本地代码。仅是方法代码内容发生了变化,但是方法的定位过程基本相同。

 

我们以关键的地址点为分割截取OAT文件数据段:

ELF头:

/

OAT数据内容开始:(注意0x10BB位置,DexHeader开始)

/

可执行本地代码部分:

/

OAT数据结束位置:

/

 

具体的OAT文件格式可以查看源代码。

Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改 本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。 阅读详情

相关推荐

大语言模型推理机制:Prefill、Decode与KV Cache解析

Transformer架构中的推理过程涉及Prefill、Decode和KV Cache三个关键技术阶段。Prefill阶段负责将输入文本转换为token序列并生成初始隐藏状态,其计算复杂度与输入长度成正比。Decode阶段则以自回归方式逐token生成输出,依赖KV Cache存储历史键值对来避免重复计算。KV Cache作为核心优化机制,通过智能管理对话记忆显著提升推理效率。这些技术在聊天机器人、代码生成等场景中至关重要,特别是KV Cache的内存优化策略直接影响大模型在边缘设备等资源受限环境中的部署

weixin_30664615的博客 436

Android ART机制分析

转自:http://www.2cto.com/kf/201401/270288.html   一、Android系统性能提升之路   Dalvik虚拟机作为Android平台的核心组成部分之一,允许在有限的内存资源中同时运行多个虚拟机实例。Dalvik虚拟机通过以下方式提升性能: 1、DEX代码安装时或第一次动态加载时odex化处理。 2、Android2.2版本提供了JIT机制提升...

iteye_7202的博客 520

【技术实践指南】Python解析FactSet Revere供应链数据:构建企业级断裂与重构监测指标

本文提供了一份企业级Python实践指南,详细解析如何利用FactSet Revere供应链数据库,构建供应链断裂与重构监测指标。内容涵盖数据清洗、关系对筛选、时间序列处理及核心指标(断裂、恢复、转移)的工程化实现,旨在帮助数据工程师与分析师搭建自动化、可解释的供应链风险监控系统。

weixin_29051811的博客 934

关于Android应用开发的时候内存的问题

由于本人是个小白,以前在开发Android应用的时候过根本没有关心过app的内存使用情况问题。好吧,现在放寒假回家写毕业设计遇到一个问题,每个应用安装完之后都应该有一个引导界面,我的也不例外,我共有3个引导界面,是使用ViewPager实现的,每个item是用一张背景图片填充的view,每张图片大小分别是:433k、649k、246k。运行在夜神模拟器上面、没有问题,但是运行在我的渣渣手机GT-i

martsforever的博客 389

AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)

我们先来看一组数据,这是我通过蝉妈妈查到的某位虚拟主播的一个带货数据,粉丝还不到 3000 人,每次直播 1 到 4 个小时,30天的总销量达到了1200单,15天,总销售额 2 万,可能相对来说客单价还是比较低,最关键的是才直播了 6 场,如果说他能够一个月直播 20 天,每天花 4个小时去直播,当个副业来做,就可以达到最起码月入 3 万的一个收入水平,我个人觉得是非常的不错的。大家把商品图片放在背景,只要场景设置的不错,场景和产品的关联度高,直播的时候挂上购买链接也会有一定的成交。

. 7万+

Splunk CVE-2018-11409认证绕过漏洞深度解析

Splunk作为主流企业级日志分析平台,其Web管理接口的认证机制直接关系到整个安全运营体系的可信边界。CVE-2018-11409本质上是REST API路由层会话校验缺失引发的未授权访问问题,根源在于`/en-US/splunkd/__raw/`路径绕过了splunkweb与splunkd之间的信任链验证,导致配置文件、用户哈希、App源码等敏感信息明文泄露。该漏洞凸显了Web接口权限模型设计失守的风险,尤其在默认配置未加固、HTTPS未启用、初始密码未修改的生产环境中危害急剧放大。结合vulfocus

weixin_30875157的博客 599

oat文件映射到虚拟内存以及类方法执行的全过程

一、映射OAT文件到内存并解析头部 若backend是Quick类型,那么会生成quick类型的机器指令。Quick类型的机器指令的函数依赖关系由JNI函数表描述,而不需要通过动态链接器进行重定位。 通过OatFile类的静态成员函数OpenElfFile来手动加载指定的OAT文件。这种方式是按照ELF文件格式来解析要加载的OAT文件的。 由ElfFile::Open()将oat文件的elf头和...

a747979985的博客 749

基于MATLAB的导弹轨迹和撞击位置仿真

本文将介绍如何使用MATLAB进行导弹轨迹和撞击位置的仿真,提高导弹的精确打击能力。首先,我们需要确定导弹的初始位置和速度,以及导弹所受到的外部环境因素如重力、空气阻力等。在MATLAB中,可以通过ODE求解器来模拟导弹的运动轨迹。最后,我们通过控制器输出的控制信号来控制导弹的姿态。通过对导弹的运动轨迹和姿态进行仿真,可以更好地预测和规划导弹的运动轨迹,提高其精确打击能力。在实际作战中,为了提高导弹精确打击能力,需要对导弹的撞击位置进行预测和规划。我们可以通过控制导弹的姿态来实现撞击目标的精确命中。

CyberLynxO的博客 1983

Android应用性能测试

Android内存限制 java虚拟机有内存使用上限的限制 adb shell进入手机,这此参数被纪录在/system/build.prop中,如果想直接查看可以使用adb shell getprop 单个应用程序最大内存限制,超过这个值会产生OOM dalvik.vm.heapgrowthlimit 应用启动后分配的初始内存 dalvik.vm.heapsta

毕小烦的学习笔记 2万+

llama-factory微调qwen2.5-vl

使用llama-factory完成qwen2.5-vl微调

qq_44908396的博客 2933

EMS案例:BMS传导发射超标整改案例

BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。

m0_56451176的博客 272

财报处理自动化实战:从手工复制粘贴到批量脚本落地

自动化处理财务报表,本质上不是依赖某个神秘工具,而是把重复劳动转化为可复用的脚本流程。在财务办公场景中,Excel、PDF、CSV等格式的月报、流水和台账往往数量庞大且字段混乱,人工逐条复制粘贴不仅耗时,还容易出错。自动化技术的核心价值在于将“逐条操作”转变为“一次规则、批量执行”,通过字段映射、批量汇总和日志追踪,让同一套规则稳定处理上百个文件。这项技术适用于月度汇总、对账核销、合同归档等高频任务,尤其适合文件数量多、规则明确且周期重复的场景。要真正实现效率翻倍,关键在于提前梳理输入环境、统一命名编码、确

weixin_34021089的博客 356

[QMT量化交易小白入门]-七十三、主力资金动向:板块与个股资金流数据API(量化python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1119

Zygote浅谈

Zygote是什么     操作系统中,进程实际上是文件到地址空间的映射像。进程将要运行时,由操作系统将其映射到地址空间,完成这项工作的事物本质也应是一个进程,我们称这个进程为孵化进程,那么这个进程怎么收到消息创建新的进程呢?可以推测,在操作系统中应当存在一个全局监听创建新进程消息的监听进程,当它收到消息时,通知孵化进程进行孵化。在安卓中,负责孵化新进程的这个进程叫做Zygote,安卓上其他的AP...

weixin_33898876的博客 278

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

为什么IOS比安卓流畅

浅谈移动操作系统——IOS 众所周知,苹果公司是以一家凭借自己优秀的软硬件资源对抗全球数十家手机公司并取得优异成绩的科技巨头,它创造了当前全球手机市场占有率极高的苹果手机,而它独创的手机系统——IOS,也是当前主流两大手机系统之一。 一、IOS 是一个什么样的系统 ios是由苹果公司开发的移动操作系统,苹果公司最早于2007年1月9日的Macworld大会上公布了这个系统。最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。 ios与苹果的Mac OS

良人眷的博客 2143

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android中的内存管理

当进程内存不够的时候,安卓会再分配一些内存给各个进程。回收的时候就可能杀死那些正在占用内存的进程。所以操作系统需要有一个合理的杀死占用内存的进程的机制,以保证把副作用降到最低。安卓系统会为每个进程合理的分配内存,从而保证每个进程能正常运行。这里我们注意,前台进程,可见进程,服务进程,正常情况下他是绝对不会被杀死和回收的。操作系统在内存不足的时候,它会有一个合理的回收和再分配的机制。安卓在开始杀死进程的时候,系统会判断杀死这个进程所带来的效益。3.在系统内存紧张的时候,尽可能多的释放掉一些非重要的资源。

Crazy Android 3171

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android虚拟机和类加载机制

一、Android虚拟机 1.虚拟机的作用 虚拟机的作用就是给我们的代码提供运行时环境。 什么是运行时? 简单来说,运行时就是一个供操作系统使用的系统,它负责将你用高级语言(比如 Java)编写的代码转换成 CPU/处理器能够理解的机器码。 运行时由你的程序运行时所执行的指令构成,尽管本质上它们不属于程序代码的任何一部分。 CPU (或者更通用的说法电脑)只能够理解机器语言(二进制代码),所以为了使程序能够在 CPU 上运行,就必须将它们翻译成机器码,这一工作由翻译器完成。 2.dalvik虚拟

Allence的博客 1010

android虚拟机原理---运行流程概述

前言 Android中,系统通过init进程创建出来的zygote进程,为每个应用创建一个进程和复制一个虚拟机实例,而每个应用都运行在一个DVM或AVM实例中;而且每个进程或线程都对应linux中的一个进程或线程 一JVM、DalvikVM、ArtVM区别 Jvm(java虚拟机):标准的虚拟机,java文件编译生成标准的多个java字节码(.class)文件,并打包成ja文件,

小钟的专栏 1万+

Android系统启动流程

当电源被启动时,引导芯片载入了预定义的引导程序(固化在ROM中),并将引导程序BootLoader加载到RAM中开始执行。

liuhaikang的博客 1482

Android虚拟机及类加载机制

Dalvik虚拟机与Java虚拟机共享有差不多的特性,但是两者执行的指令集是不一样的,前者的指令集是基于寄存器的,而后者的指令集是基于栈的。具体来说,它可以加载指定的dex,以及jar、zip、apk中的classes.dex,这是应用默认使用的类加载器,在应用启动时由系统创建,通常只能加载。是实现热修复、插件化、动态加载等技术的核心。数组来实现的,例如,将包含修复代码的 DEX 文件插入到数组的前面,使其优先被加载,从而覆盖有问题的旧类。等,由系统内部实现,是单例的,它是所有其他类加载器的“父加载器”。

2301_76966938的博客 981

Android内存优化:从构成到实战

Android内存优化指南 Android应用内存主要由六部分组成:Java堆(存放Java对象)、本地堆(C/C++内存)、代码段、栈空间、图形内存和其他系统资源。常见问题包括Java堆溢出、本地内存泄漏、图形资源未回收等。优化建议:减少大对象使用、控制线程数量、及时回收Bitmap和Native内存、合理使用缓存。开发中可通过Android Profiler、dumpsys meminfo等工具分析内存分布,重点关注Java堆和Native堆的使用情况。不同内存区域管理方式各异,需针对性优化才能有效提升

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1174

Android 系统源码-1:Android 系统启动流程源码分析

现在我们来梳理下 Android 系统的启动过程。Android 启动过程还是比较重要的,因为在这个过程中除了要完成 Linux 系统的初始化工作还要完成 Android 的基础服务和启动界面的初始化工作。 在这篇文章中,我们不打算过多深入源码。因为 Android 中任何一个功能模块在 Framework 层都涉及大量的代码调用。过多深入源码只会让我们迷失在一层层的调用栈中。相比之下,我更倾向于...

weixin_34261415的博客 566

Android虚拟机与ClassLoader类加载

JVM与Dalvik Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。 Dalvik虚拟机与Java虚拟机共享有差不多的特性,差别在于两者执行的指令集是不一样的,前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。 基于栈的虚拟机 对于基于栈的虚拟机来说,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一次方法调用,栈中

puppy的博客 1416

Android 系统架构图

Android 操作系统架构开篇:http://gityuan.com/android/https://cloud.tencent.com/developer/article/1429122 Android架构图(五层框架):https://www.cnblogs.com/pengdonglin137/p/3858254.html 官方系统架构图:h...

墨鱼菜鸡 6764

为什么 Go 占用那么多的虚拟内存?

前段时间,某同学说某服务的容器因为超出内存限制,不断地重启,问我们是不是有内存泄露,赶紧排查,然后解决掉,省的出问题。我们大为震惊,赶紧查看监控+报警系统和性能分析,发现应用指标压根就不...

EDDYCJY的博客 3019
下一篇: 剖析Python3相对于2版本以后的主要变化
JBlock
博客等级 码龄9年 189粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值