一、Java代码是怎么运行的?

一.Java 和 C++ 在运行方式上的区别

C++会直接被编译为机器码,可以被CPU所理解。

Java 代码有很多种不同的运行方式,比如说可以在开发工具中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至可以在网页中运行。当然,这些执行方式都离不开 JRE,也就是 Java 运行时环境。
JRE 仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。我们 Java 程序员经常接触到的 JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。

二.为什么 Java 要在虚拟机里运行?

Java 作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实。所以呢,在运行 Java 程序之前,我们需要对其进行一番转换。
Java 虚拟机可以由硬件实现,但更为常见的是在各个现有平台(如 Windows_x64、Linux_aarch64)上提供软件实现。这么做的意义在于,一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。这也就是我们经常说的“一次编写,到处运行”。
虚拟机的另外一个好处是它带来了一个托管环境(Managed Runtime),托管环境提供了诸如数组越界、动态类型、安全权限等等的动态检测。

三.Java 虚拟机具体是怎样运行 Java 字节码的?

从虚拟机视角来看,执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。

Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

java能否脱离jvm运行 java脱离虚拟机_jar

四.Java 虚拟机的运行效率究竟是怎么样的?

java能否脱离jvm运行 java脱离虚拟机_java能否脱离jvm运行_02


在 HotSpot中有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

五.总结

  1. Java代码之所以要在虚拟机中运行,1是因为作为高级语言抽象程度很高,直接在硬件上实现非常困难,2是在虚拟机中运行提供了可移植性。
  2. Java代码在虚拟机中运行的好处,1是可移植性,2是虚拟机提供了代码托管环境,能够帮助处理一些数组越界、动态类型、安全权限等等的动态检测。
  3. Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。Java 程序编译而成的class 文件,需要先加载至方法区中,方能在 Java 虚拟机中运行。
  4. 为了提高运行效率,标准 JDK 中的 HotSpot 虚拟机采用的是一种混合执行的策略,对于热点代码会进行即时编译,加快执行效率,对非热点代码会进行解释编译。

二、Java的基本类型

三、Java虚拟机是如何加载Java类的?

四、JVM是如何执行方法调用的?(上)

五、JVM是如何执行方法调用的?(下)

六、JVM是如何处理异常的?