wordpress 导航站,949公社招聘信息,中企动力天津分公司,济南网站推广服务#x1f525; 安卓虚拟机 #x1f525; 虽然Android程序是使用Java语言开发的#xff0c;当然#xff0c;现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上#xff0c;而是只能运行在一个类似JVM的Android虚拟机上。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.2Google在Andriod虚拟机中加入了JIT编译器Just-In-Time Compiler。 3、Android 4.4Google带来了全新的虚拟机运行环境ART此时ART和Dalvik是共存的用户可以在两者之间进行选择。 4、Android 5.0ART全面取代了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虚拟机有共享机制不同应用之间在运行时可以共享相同的类拥有更高的效率。 什么是JITJust-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而是使用了AOTAhead-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.0JIT回归采用JIT和AOP混合编译模式。 4、ART持续更新优化 Dalvik VM 和 ART VM 有什么区别 1、ART早期使用AOT技术后期使用AOTJIT混合而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发送回主线程进行显示。 使用线程的优势是线程之间的切换开销较小可以更高效地实现并发性和响应性。同时线程共享进程的资源可以更方便地进行数据共享和同步操作。然而线程之间的同步和通信需要更小心地处理以避免数据竞争和死锁等问题。 总结 进程和线程在不同场景下具有不同的优势和适用性。进程适用于需要较高的隔离性和安全性的场景而线程适用于需要更高的并发性和响应性的场景。根据具体需求和设计考虑我们可以选择合适的进程和线程组合来构建应用程序。