摘要:本文主要学习了虚拟机的整体架构。
环境
Windows 10 企业版 LTSC 21H2
Java 1.8
1 简介
1.1 定义
虚拟机(Java Virtual Machine,JVM)是Java程序运行的核心环境,它负责将class文件解释或编译为本地机器指令,并管理内存、线程、垃圾回收等关键任务。
1.2 体系结构
Java编译器输入的指令流有两种:
- 基于栈的指令集架构:特点是不需要硬件支持,可移植性更好,更好实现跨平台。
- 基于寄存器的指令集架构:特点是性能优秀和执行更高效。
由于跨平台性的设计,Java的指令集基于栈进行设计。
JVM模型如下:
模型包括类加载器、运行时数据区、执行引擎、本地接口、本地类库。
1.3 发展历史
1.3.1 Sun Classic VM
早在1996年JDK1.0版本的时候,Sun公司发布的Java虚拟机,是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。
这款虚拟机内部只提供解释器,还没有JIT编译器,效率比较低。
可以通过外挂使用JIT编译器,但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统,解释器就不再工作,解释器和编译器不能配合工作。
现在HotSpot VM内置了此虚拟机。
1.3.2 Exact VM
为了解决上一个虚拟机问题,在JDK1.2时Sun公司提供了此虚拟机。
这款虚拟机具备现代高性能虚拟机的维形,不仅支持热点探测,还支持编译器与解释器混合工作模式。
1.3.3 HotSpot VM
最初由Longview Technologies公司设计。1997年,此公司被Sun公司收购。2009年,Sun公司被甲骨文公司收购。
在JDK1.3时,成为默认的虚拟机。
名称中的HotSpot指的就是它的热点代码探测技术:
- 通过计数器找到最具编译价值代码,触发即时编译或栈上替换。
- 通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。
1.3.4 Taobao JVM
由阿里JVM团队发布,基于Hotspot VM发布的国内第一个深度定制且开源的高性能服务器版Java虚拟机。
硬件严重依赖Intel的CPU,损失了兼容性,但提高了性能。
1.3.5 Graal VM
2018年4月,Oracle Labs公开了Graal VM,号称“Run Programs Faster Anywhere”,野心勃勃。与1995年Java的“write once,run anywhere”遥相呼应。
是在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为任何语言的运行平台使用,包括Java、Scala、Groovy、Kotlin、C、C++、Javascript、Ruby、Python、R等。
工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。
2 组成部分
2.1 类加载器
类加载器的作用是读取编译后的class文件,寻找类并加载到JVM内存中。
2.2 运行时数据区
运行时数据区的作用是在程序执行期间存储数据,包括类的信息,变量和常量,代码和指令,计算结果等数据。
在JDK1.8以前,运行时数据区是由程序计数器、本地方法栈、虚拟机栈、堆、方法区组成。
在JDK1.8以后,在本地内存增加了元空间的概念,将方法区从运行时数据区移除并作为元空间的实现放到了本地内存。
其中,方法区和堆是线程共享区域,虚拟机栈和本地方法栈以及程序计数器是线程私有区域。
2.3 执行引擎
执行引擎的作用是对class文件中的字节码进行编译解释,转换为机器指令码并执行。
在执行指令码时,会将计算结果存储在运行时数据区中。
2.4 本地接口
本地接口的作用是为执行引擎提供支持。
2.5 本地类库
本地类库的作用是为执行引擎和本地接口提供支持。
条