1、JVM和Java体系结构

JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(.class二进制字节码文件),就可以在多种平台上不加修改地运行

JVM还是一个跨语言的平台,除了java语言,很多语言都可以在JVM上进行运行,只有遵守JVM规范,使用自己的编译器生成.class字节码文件

image-20220228220331600

也就是说,JVM只关心字节码文件,并不关心该字节码文件是由什么语言编译的

JVM的位置

image-20220228223647493

JVM的整体结构

HotSpot虚拟机是目前市面上高性能虚拟机的代表之一,采用解释器和即使编译器共存的架构

image-20220228223947549

image-20220302154334001

类装载器子系统:主要负责将每个字节码文件加载到内存中,生成Class对象,涉及加载、链接等过程

运行时数据区:内存中的主要结构,方法区和堆区是多线程共用的,其余的虚拟机栈、本地方法栈、程序计数器是每个线程都有一份

执行引擎:主要包括解释器、JIT及时编译器(编译器的后端,编译.java的编译器成为前端编译器)、垃圾回收器

JVM的架构模型

Java编译器输入的指令流基本是基于栈的指令集架构;还有一种指令集架构就是基于寄存器的指令集架构

例如,同样执行2+3的操作:

基于栈

iconst_2 //常量2入栈
istore_1 
iconst_3 //常量3入栈
istore_2
iload_1
iload_2
iadd	 //常量2、3出栈,执行相加
istore_0 //结果5出栈

基于寄存器

mov eax,2 //将eax寄存器的值设为1
add eax,3 //是eax寄存器的值加3

反编译java文件就可以看到,java是基于栈的内存指令

public class Demo {	
	public static void main(String[] args) {
		int i = 2;
		int j = 3;
		int k = i + j;
	}	
}

使用javap -v Demo.class命令对生成的字节码文件进行反编译

image-20220228232356321

JVM的声明周期

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现来指定的

虚拟机的执行

虚拟机的退出

常见的JVM

Sun Classic VM

java1.0时发布,java1.4被淘汰

是世界上第一款商用的Java虚拟机

现在默认使用的Hotspot虚拟机内置了Sun Classic VM

虚拟机内部只提供了解释器,而现在主流的JVM都是解释器+JIT编译器(即时编译器)

Exact VM

java1.2提供此虚拟机

Exact Memory Management:准确式内存管理,虚拟机可以知道内存某个位置的数据具体是什么类型

具有现代高性能虚拟机的雏形:热点特测、编译器和解释器混合工作,被Hotspot虚拟机替换

HotSpot VM(默认)

三大高性能虚拟机之一

java1.3成为默认虚拟机

HotSpot这个名字就是指它的热点代码探测技术

JRockit

三大高性能虚拟机之一

专注于服务器端应用,不在乎应用的启动速度,所以不包含解释器,全部代码都使用即时编译器编译后执行

是世界上最快的JVM

由BEA开发,现在已经被Oracle收购,Oracle大致在JDK8完成和HotSpot整合

J9

三大高性能虚拟机之一

IBM开发

市场定位和HotSpot接近,服务器端、桌面应用、嵌入式等