Android 面试题 虚拟机、进程、线程 七

🔥 安卓虚拟机 🔥

虽然Android程序是使用Java语言开发的,当然,现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上,而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种,分别是Dalvik虚拟机ART虚拟机

 🔥 Dalvik 虚拟机 🔥

Dalvik虚拟机是Google自己设计的用于Android平台的虚拟机,它曾经是Android平台的核心组成部分之一。它负责加载dex/odex文件并解析成机器码然后执行。Dalvik虚拟机并没有遵循《Java虚拟机规范》,因此不能算是Java虚拟机。但是它与Java却又有联系,它执行的DEX文件是通过Class文件转化而来。我们也可以认为它是为了能在安卓设备运行而对JVM进行优化的产物

🔥  Dalvik 的历史 🔥

1、Android 1.0,使用Dalvik作为Android虚拟机运行环境。

2、Android 2.2,Google在Andriod虚拟机中加入了JIT编译器(Just-In-Time Compiler)。

3、Android 4.4,Google带来了全新的虚拟机运行环境ART,此时ART和Dalvik是共存的,用户可以在两者之间进行选择。

4、Android 5.0,ART全面取代了Dalvik成为了Android虚拟机运行环境,至此Dalvik退出历史舞台。

🔥 Dalvik 特点 (与JVM的区别)🔥 

 1、Dalvik虚拟机运行的是Dalvik字节码,Dalvik字节码由Java字节码转换而来,并被打包到一个dex文件中。而JVM运行的是class文件或jar文件。

2、加载速度快,dex相比于Jar文件会把所有包含的信息整合在一起,减少了冗余信息。这样就减少I/O操作,提高类的查找速度。

3、Dalvik虚拟机是基于寄存器,而JVM是基于栈(操作数栈)。虽然基于寄存器执行效率好,但是可移植性差,难跨平台。

4、Dalvik虚拟机允许在有限的内存中同时运行多个进程,每一个应用都运行在一个Dalvik虚拟机实例中,拥有独立的进程空间。

5、Dalvik虚拟机有共享机制,不同应用之间在运行时可以共享相同的类,拥有更高的效率。

🔥 什么是JIT(Just-In-Time Compiler ) 🔥

早期没有JIT的时候,虚拟机运行时,会通过解释器来解释字节码并将其翻译为机器码,逐条读入,逐条翻译,最后再执行,这样就比较慢,效率不高。针对上面这个问题,引进了JIT(即时编译器)技术。它是一种优化手段

 JIT技术简单来说就是将解释过的机器码缓存起来,下次再执行时到这个方法的时候,则直接从缓存里面取出机器码来执行。减少了读取字节码和翻译字节码的操作。以此来提高效率。JIT技术的引入使得Dalvik的性能提升了3~6倍

不过要注意的是并不是所有执行过的代码对应的机器码都会被缓存起来。而是只有被认定为热点代码(Hot Spot Code) 的代码才会。这里所指的热点代码主要有两类,包括:

  • 被多次调用的方法
  • 被多次执行的循环体(虽然只是循环体被多次执行,但仍是将整个方法的机器码缓存起来)

JIT技术虽好,但是也是有缺点的:

  • 每次重新启动引用都需要重新编译
  • 运行时比较耗电

🔥 什么是dex 🔥 

dex是二进制文件,用于在Android虚拟机上执行。是通过把所有的class文件进行合并优化得到的。dex文件去除了class文件中的冗余信息(比如重复字符串),并且结构更加紧凑,因此在dex解析阶段可以减少I/O操作,提高类查找速度。

它与.jar文件不同,.jar文件像是一个文件夹,里面的.class是单独的文件,各个class信息里面会出现重复的信息。而dex文件,则将所有的.class里面的信息整合在一起,去除掉里面的重复数据。 

🔥 什么是odex 🔥 

 odex是从apk提取出dex文件并通过优化后得到的产物,它被保存到data/dalvik-cache目录下。原apk文件中的classes.dex可以保留也可以删除,甚至有时候会留下残缺的dex文件。

 系统在首次启动时,需要对预置的apk进行安装,此时需要将dex从apk文件中解压出来放到data/app文件夹中。

1、在Dalvik虚拟机中,会通过dexopt来对dex进行优化,生成odex文件,并将其保存到手机的VM缓存文件夹data/dalvik-cache下(注意,这边生成的odex文件后缀依然是dex )。它是一个dey文件,里面仍然还是字节码。

2、在ART虚拟机上,同样会在首次进入系统的时候使用dexopt工具来对dex进行优化,不过此时的优化是将dex字节码翻译成本地机器码。并保存在data/dalvik-cache下。

一般情况下,在Android系统进行编译的时候,预处理提取Odex文件的话,将会大大优化系统首次启动时间。 

🔥 ART 虚拟机 🔥 

ART虚拟机在Android 5.0开始替换Dalvik虚拟机。其处理应用程序执行的方式不同于Dalvik虚拟机,它不使用JIT而是使用了AOT(Ahead-Of-Time),也就是提前编译技术。并且对垃圾收集器也进行了改进和优化,当然也还包括了其他的优化。

🔥 T( Ahead-Of-Time ) 🔥 

AOT也就是提前编译技术。简单来说就是提前将字节码转换成本地机器码,然后存储在本地磁盘上,运行时可以直接执行,避免了Dalvik时期的应用运行时再来解释字节码。运行时效率大大提高。

 在Android 7.0 之前,Android系统安装应用的时候,会进行一次预编译,将字节码预先编译成本地机器码,生成.oat文件,并存储在本地磁盘上,也就是AOT技术。这样在应用每次运行时就不需要重新编译,可以直接使用编译好本地机器码,运行效率大大提升。但是这也使得安装应用的时间大大增加,于是在Android7.0,又重新引进了JIT技术,形成JIT/AOT混合编译模式,这种混合编译的特点是:

1、应用在安装的时候,不进行AOT预编译。

2、应用运行时这直接通过解释器翻译字节码为机器码然后执行。并同时记录热点代码信息到profile文件中。

3、手机进入空闲或充电状态的时候,系统会扫描APP目录下的profile文件,并通过AOT对热点代码进行编译。

4、下一次启动时,会根据profile文件来运行已编译好的机器码,避免在运行时对已经变过的方法又进行了JIT编译。

5、应用运行期间会持续对热点代码进行记录,以方便在空闲或充电时进行AOT,以此循环。

使用了JIT来对AOT进行补充,可以提升运行时性能,节省存储空间,加快应用运行速度。 具体可以查看google官方文档:实现 ART 即时 (JIT) 编译器 

 🔥 ART垃圾收集器优化 🔥

1、只有一次GC暂停(Dalvik需要两次)

2、并发复制,可减少后台内存使用和碎片

3、GC暂停的时间不受堆大小影响

4、在清理最近分配的短时对象这种特殊情况中,回收器的总GC时间更短

5、优化了垃圾回收的工作效率,能够更加及时地进行并行垃圾回收,这使得GC_FOR_ALLOC事件在典型用例中极为罕见

🔥 ART时间线 🔥 

1、Android 4.4 ,ART和Dalvik是共存的,用户可以在两者之间进行选择。

2、Android 5.0,正式取代Dalvik虚拟机成为Android虚拟机运行环境,Dalvik退出历史舞台,AOT取代JIT。

3、Android 7.0,JIT回归,采用JIT和AOP混合编译模式。

4、ART持续更新优化

🔥 Dalvik VM 和 ART VM 有什么区别 🔥 

1、ART早期使用AOT技术,后期使用AOT+JIT混合,而Dalvik使用JIT

2、ART支持64位CPU并兼容32位CPU,而Dalvik只支持32位CPU

3、ART对垃圾收集器进行了改进优化,提高了吞吐量。

🔥 Devik 进程 、Linux进程、线程区别 🔥

 Devik进程(也称为Zygote进程)是Android系统中的一个特殊进程,用于提高应用程序的启动速度和内存使用效率。Devik进程在系统启动时就会被创建,并且会保持运行,以便能够更快地启动应用程序。

Linux进程 是指在Linux操作系统上运行的程序实例。每个进程都有独立的内存空间和执行环境,它们彼此之间相互隔离,通过进程间通信(IPC)机制进行交互。

线程是进程内的执行单元,它是进程的一个执行流程。同一进程内的线程共享进程的地址空间和资源。线程是并发执行的,可以同时执行多个线程,共享进程的内存和上下文,因此线程之间的通信更加高效。 

区别 : 

1、上下文切换:在Linux进程间切换时,需要保存和恢复整个进程的上下文信息,包括寄存器、打开文件等。而在线程切换时,只需切换线程的上下文,开销较小。

2、内存和资源共享:线程在同一进程内共享内存和资源,可以直接访问进程的地址空间和文件描述符。而不同进程之间的内存和资源是独立的,需要通过进程间通信来实现共享。

3、创建和销毁开销创建和销毁进程的开销较大,需要分配独立的内存空间和资源。而创建和销毁线程的开销较小,因为它们共享进程的资源。

4、并发性和效率:线程之间的切换开销小,可以实现更高的并发性和响应性,适用于需要并发处理的任务。而进程间的切换开销较大,适用于需要更高的隔离性和安全性。

5、编程模型:线程的编程模型相对简单,可以通过共享内存来实现线程间的通信和同步。而进程间通信需要使用更复杂的机制,如管道、消息队列、共享内存等。

Devik进程 是Android系统中用于加速应用程序启动的特殊进程,而Linux进程是在Linux操作系统上运行的程序实例。线程 是进程内的执行单元,具有较小的开销和高效的通信能力。进程和线程在资源隔离、通信方式和切换开销等方面存在明显的区别。 

 🔥 进程使用 案例 🔥

假设我们有一个计算器应用程序,该应用程序具有图形界面和后台计算服务。在这种情况下,我们可以将图形界面部分作为一个进程,后台计算服务作为另一个进程。

图形界面进程:该进程负责与用户交互,并显示计算器的图形界面。它处理用户的输入,显示计算结果等。 

后台计算服务进程:该进程负责执行实际的计算任务。它接收来自图形界面进程的计算请求,并执行复杂的计算操作。计算结果可以通过进程间通信(IPC)机制发送回图形界面进程进行显示。 

使用进程的优势是可以实现较高的隔离性,确保图形界面进程和后台计算服务进程相互独立运行,互不干扰。同时,进程间通信机制可以在进程之间进行数据传递和同步操作。然而,进程间切换的开销相对较高。 

🔥  线程使用 案例 🔥 

在计算器应用程序中,我们可以使用线程来并发地执行计算任务。

主线程:主线程负责处理图形界面的渲染和用户交互。它接收用户输入,并将计算请求发送到计算线程进行处理。主线程还负责接收计算结果,并在图形界面上显示出来。

 计算线程:计算线程是一个后台线程,负责执行复杂的计算任务。它接收主线程发送的计算请求,并在后台执行计算操作。计算结果可以通过线程间通信机制(如Handler)发送回主线程进行显示。

使用线程的优势是线程之间的切换开销较小,可以更高效地实现并发性和响应性。同时,线程共享进程的资源,可以更方便地进行数据共享和同步操作。然而,线程之间的同步和通信需要更小心地处理,以避免数据竞争和死锁等问题。

🔥 总结 🔥 

进程和线程在不同场景下具有不同的优势和适用性。进程适用于需要较高的隔离性和安全性的场景,而线程适用于需要更高的并发性和响应性的场景。根据具体需求和设计考虑,我们可以选择合适的进程和线程组合来构建应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 日志

Spring Boot 日志 ​ 在 Spring Boot 里面是有一个内置了的日志框架的,所以才能运行的时候在控制台打印出来。默认情况下的日志是系统定义和打印的,但我们也可以自行自定义打印日志。 日志的好处: 1、发现问题和定位问题;☆&am…

QT编写的串口助手

QT编写的串口助手 提前的知识 创建UI界面工程 找帮助文档 添加串口的宏

亚马逊品牌推荐金计划:通过亚马逊外营销活动赚取奖金!

亚马逊美国站发布公告称新推出的品牌推荐金计划可以让卖家在通过亚马逊外营销活动的销售中获得奖金,当卖家将非亚马逊营销流量引导至亚马逊时,您将获得促销产品以及客户在接下来的两周内购买的任何品牌产品平均销售额的10%的奖金,以下是公告内…

【NLP】训练chatglm2的评价指标BLEU,ROUGE

当进行一定程度的微调后,要评价模型输出的语句的准确性。由于衡量的对象是一个个的自然语言文本,所以通常会选择自然语言处理领域的相关评价指标。这些指标原先都是用来度量机器翻译结果质量的,并且被证明可以很好的反映待评测语句的准确性&a…

ubuntu服务器配置ftp服务

需求:配置ftp服务用于在windows电脑上直接浏览、下载、上传ubuntu服务器上的文件,用于文件共享,方便实用 效果:用户打开windows资源管理器后输入ftp://xxx.xxx.xxx.xxx (公网IP地址)后,即可浏览…

ChatGPT及其工作原理;OpenAI申请注册商标GPT-5,引发关注

🦉 AI新闻 🚀 OpenAI申请注册商标GPT-5,引发关注 摘要:OpenAI已在上月18日申请注册商标GPT-5,显示该模型将提供文本生成、自然语言理解、语音转录、翻译、分析等功能。此前OpenAI曾表示尚未开始训练GPT-4的后继者GPT…

Atlas200DK A2联网实战

文章目录 1.Atlas原始网络信息2. 开发板联网2.1 使用Type-c 连接开发板2.2 修改本地网络适配器2.3 修改开发板网络信息2.4 测试外网连接 1.Atlas原始网络信息 Type-C 网口 ETH0 网口 ETH1 网口 2. 开发板联网 2.1 使用Type-c 连接开发板 使用xshell 等ssh终端登录开发板&…

(树) 剑指 Offer 33. 二叉搜索树的后序遍历序列 ——【Leetcode每日一题】

❓剑指 Offer 33. 二叉搜索树的后序遍历序列 难度:中等 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1…

Linux lvs负载均衡

LVS 介绍: Linux Virtual Server(LVS)是一个基于Linux内核的开源软件项目,用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡,从而提高系统的可扩展性和可…

PHP正则绕过解析

正则绕过 正则表达式PHP正则回溯PHP中的NULL和false回溯案例案例1案例2 正则表达式 在正则中有许多特殊的字符,不能直接使用,需要使用转义符\。如:$,(,),*,,.,?,[,,^,{。 这里大家会有疑问:为啥小括号(),这个就需要两个来转义&a…

智能制造企业如何建立大客户管理模型?

01、大客户管理依然是智能制造企业经营的黄金定律 《连线》杂志创始人凯文凯利(Kevin Kelly)在《技术元素》一书中写道:“数量不是目的,质量才是根本,重视1%的超级用户才是提高效率的关键。” 根据“二八定律”&…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

C++---list常用接口和模拟实现

list---模拟实现 list的简介list函数的使用构造函数迭代器的使用list的capacitylist element accesslist modifiers list的模拟实现构造函数,拷贝构造函数和迭代器begin和endinsert和eraseclear和析构函数 源码 list的简介 list是用双向带头联表实现的一个容器&…

C—数据的储存(下)

文章目录 前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四 🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数&#x…

提高生产线效率:PDM系统的工艺优化智慧

在现代制造业中,提高生产线效率是企业追求高质量和降低成本的重要目标。PDM系统(Product Data Management,产品数据管理)作为一款强大的数字化工具,发挥着工艺优化智慧的作用,帮助企业实现生产线效率的提升…

C# 回文链表

234 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入&…

TPlink云路由器界面端口映射设置方法?快解析内网穿透能实现吗?

有很多网友在问:TPlink路由器端口映射怎么设置?因为不懂端口映射的原理,所以无从下手,下面小编就给大家分享TPlink云路由器界面端口映射设置方法,帮助大家快速入门TP路由器端口映射设置方法。 1.登录路由器管理界面&a…

性能测试/负载测试/压力测试之间的区别

做测试一年多来,虽然平时的工作都能很好的完成,但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺,所以,在工作之余也做了一些测试方面的知识的补充。不足之处,还请大家多多交流,互相学习。 …

Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展

我们非常兴奋地宣布,Amazon Aurora Serverless v2 现已面向 Aurora PostgreSQL 和 MySQL 正式发布。Aurora Serverless 是一种面向 Amazon Aurora 的按需自动扩展配置,可让您的数据库根据应用程序的需求扩展或缩减容量。 亚马逊云科技开发者社区为开发者…

Hudi Flink SQL源码调试学习(1)

前言 本着学习hudi-flink源码的目的,利用之前总结的文章Hudi Flink SQL代码示例及本地调试中的代码进行调试,记录调试学习过程中主要的步骤及对应源码片段。 版本 Flink 1.15.4Hudi 0.13.0 目标 在文章Hudi Flink SQL代码示例及本地调试中提到:我们…