JRE: 包含Java虚拟机以及核心类库
JDK: 同样包含了JRE,并且附带了一系列开发、诊断工具
一、为什么Java要在虚拟机中运行
一、 Java语言特性:高级、语法复杂、抽象
Java语言-- 【编译器】 --> Java字节码 --【虚拟机】–> 实现
二、 托管环境
自动内存管理 & 垃圾回收
二、虚拟机如何运行Java字节码
2.1 虚拟机执行前的动作
加载后的Java类会被存放于方法区中,实际运行时,虚拟机会执行方法区内的代码
从机器自身硬件视角看,Java字节码也无法直接执行,Java虚拟机需要将字节码翻译成机器码。
2.2 虚拟机的动作
翻译过程有两种形式:
1.解释执行 逐条将字节码翻译成机器码并执行
2.即使编译(JIT) 将一个方法中包含的所有字节码编译成机器码后再执行
两种翻译形式 | 特点 | 应用场景 |
---|---|---|
解释执行 | 无需等待编译 | 适用于大部分不常用代码(80%) |
即时编译 | 实际运行速度快 | 适用于小部分热点代码(20%) |
HotSpot 默认采用了混合模式,结合了二者的有点,它会先解释执行字节码,然后将其中反复执行的热点代码,以方法为单位进行即时编译。
三、Java虚拟机的运行效率探讨
理论上,即时编译后的Java程序的运行效率,是可能超过C++程序的,因为与静态编译相比,即时编译拥有程序的运行时信息。
HotSpot 内置了多个即时编译器:C1(Client编译器,面向客户端GUI程序)、C2(Server编译器,面向服务器端成需) 和 Graal
Java7开始,HotSpot 采用分层编译的方式 热点方法首先被C1编译,然后热点方法中的热点会进一步被C2编译
在计算资源充足的情况下,字节码的解释执行和即时编译执行可同时进行,编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行