Java 虚拟机和Dalvik虚拟机和ART虚拟机

首先何为虚拟机

从本质上讲,虚拟机是个被构建来提供特定或通用目的服务环境的非实体计算机,Java虚拟机它是解决跨平台服务的载体,是字节码和底层平台之间的桥梁。主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。

JVM介绍

jvm构造
包括,方法区、虚拟机栈、本地方法栈、堆、程序计数器。

在这里插入图片描述
jvm执行过程
大体过程如图:
在这里插入图片描述
细节过程,如下:
在这里插入图片描述
JVM详细介绍可参考https://blog.csdn.net/qq_41701956/article/details/81664921

这里涉及到类加载过程,也就是在编译完成之后(.java -> .class)由类加载器把.class加载到内存的过程。可参考:
https://blog.csdn.net/qq_34996727/article/details/80684788
https://blog.csdn.net/qq_36522306/article/details/80584595
https://blog.csdn.net/ln152315/article/details/79223441

DVM(Dalvik Virtual Machine)介绍

在Android操作系统中的位置
Android系统由Linux内核函数库Android运行时应用程序框架应用层 组成。其中Dalvik虚拟机属于Android运行时环境,它与一些核心库共同承担Android应用程序的运行工作。
在这里插入图片描述
Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

::Dalvik将堆分成了Active堆和Zygote堆,Zygote堆是Zygote进程在启动的时候预加载的类、资源和对象,除此之外的所有对象都是存储在Active堆中的。
Dalvik的gygote堆存放的预加载的类都是Android核心类和java运行时库,这部分内容很少被修改,大多数情况父进程和子进程共享这块内存区域。通常垃圾回收重点对Active堆进行回收操作,Dalvik为了对堆进行更好的管理创建了一个Card Table、两个Heap Bitmap和一个Mark Stack数据结构。(源自 https://www.jianshu.com/p/713d24fa9982
::Dalvik使用即时编译(JIT),即是在程序运行过程中进行编译。JIT会在运行时分析应用程序的代码,识别哪些方法可以归类为热方法,这些方法会被JIT编译器编译成对应的汇编代码,然后存储到代码缓存中,以后调用这些方法时就不用解释执行了,可以直接使用代码缓存中已编译好的汇编代码。JIT是在2.2版本提出的,目的是为了提高Android的运行速度,一直存活到4.4版本,因为在4.4之后的ROM中,就不存在Dalvik虚拟机了。JIT是运行时编译,这样可以对执行次数频繁的dex代码进行编译和优化,减少以后使用时的翻译时间,虽然可以加快Dalvik运行速度,但是还是有弊病,那就是将dex翻译为本地机器码也要占用时间,所以Google在4.4之后推出了ART,用来替换Dalvik。在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0+,Dalvik虚拟机则被彻底的丢弃,全部采用ART。

jvm 和 dvm的区别:
1、jvm基于栈的架构.栈是内存上面的一段连续的存储空间。dvm基于寄存器的架构.寄存器是CPU上面的一块存储空间。选择基于寄存器的方式是因为它对提前优化(ahead-of-time optimization)提供了更好的支持。
2、jvm运行的是java字节码。(java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)
dvm运行的是自定义的.dex字节码格式。(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据,一个dex文件方法数不能超过65535。) 类加载的过程(类装载子系统)也是在dvm里面的。
JVM: .java -> javac -> .class -> jar -> .jar , 架构: 堆和栈的架构.
DVM: .java -> javac -> .class -> dx.bat -> .dex , 架构: 寄存器(cpu上的一块高速缓存)。
3、jvm只能运行一个实例, 也就是所有应用都运行在同一个JVM中,dvm经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Android应用运行在一个独立的虚拟机中,每一个虚拟机实例都作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

ART(Anroid RunTime)虚拟机介绍

ART的策略与Dalvik不同,ART 内置了一个 Ahead-of-Time 编译器,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。Dalvik 使用 JIT(Just in time)编译而 ART 使用 AOT(Ahead of time)编译。Android 4.4(Kitkat)开始引入了 ART 作为运行时,从 Android 5.0(Lollipop)开始 ART 就全面取代了Dalvik。Android 7.0 向 ART 中添加了一个 just-in-time(JIT)编译器,这样就可以在应用运行时持续的提高其性能。ART也是一种虚拟机,相较于DVM只是改变了编译策略。

ART 和 DVM
在这里插入图片描述Android上的ART虚拟机 https://paul.pub/android-art-vm/

老罗-Android运行时ART执行类方法的过程分析
https://blog.csdn.net/luoshengyang/article/details/40289405

老罗-Android运行时ART加载类和方法的过程分析
http://blog.csdn.net/luoshengyang/article/details/39533503

老罗-Android运行时ART加载OAT文件的过程分析
http://blog.csdn.net/luoshengyang/article/details/39307813

老罗-ART运行时为新创建对象分配内存的过程分析
https://blog.csdn.net/Luoshengyang/article/details/42492621

老罗-ART运行时垃圾收集机制简要介绍和学习计划
https://blog.csdn.net/luoshengyang/article/details/42072975

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值