Java 字节码必须转换成机器码吗?

Java 字节码必须转换成机器码吗?,java,jvm,Java,Jvm,我对JVM的角色感到困惑。我对JVM只将字节码转换为机器码的理解正确吗?因此,本质上是操作系统、JVM和CPU之间的通信。我的假设是字节码转换成机器码,然后由CPU处理。JVM是一个虚拟机 就像在VMware或VirtualBox上安装某些操作系统(Linux、Solaris)时,这些都是虚拟机。它们运行在主机操作系统之上 JVM的不同之处在于它的机器代码是字节码。有些机器的机器代码是高级语言。如果JVM在硬件上运行,而不是在主机操作系统上运行,那么它将期望硬件能够使用字节码指令集 但是,由于它

我对JVM的角色感到困惑。我对JVM只将字节码转换为机器码的理解正确吗?因此,本质上是操作系统、JVM和CPU之间的通信。我的假设是字节码转换成机器码,然后由CPU处理。

JVM
是一个虚拟机

就像在VMware或VirtualBox上安装某些操作系统(Linux、Solaris)时,这些都是虚拟机。它们运行在主机操作系统之上

JVM
的不同之处在于它的机器代码是
字节码。有些机器的机器代码是高级语言。如果JVM在硬件上运行,而不是在主机操作系统上运行,那么它将期望硬件能够使用
字节码
指令集


但是,由于它在主机操作系统上运行,任何字节码指令在转换为机器代码后都会与主机通信。对于VMware/VirtualBox,这些软件会处理它。对于JVM,它是由JRE来完成的。JAVA是一种编译和解释语言,而不仅仅是解释语言。让我们看一步一步地执行它的程序

  • 假设我们编写一个java程序,并将其保存为“hello.java”,保存在硬盘上某个文件夹中
  • java编译器的名称是“javac”。对于它的编译,我们必须在命令行上编写“javac hello.java”
  • 在此阶段,高级代码转换为机器级代码。Java将其转换为一个.class文件,名为“hello.class”。此代码也称为字节码,因为此文件中的每条指令都有1个字节
  • 该字节码也可以在任何其他平台上删除,如 Mac、Linux或Windows。它只需要相应操作系统的一个JVM就可以完成它的任务 执行。因此,JAVA被称为第一个独立于平台且 架构中立的语言
  • 现在,为了执行它,使用了解释器。它本身被称为“java”。对于它的解释,“javahello.java”应该在命令行上使用。它在内部调用类加载器,该加载器负责将“hello.class”文件从硬盘加载到JVM的地址空间
  • 这里有一个“字节码验证器”,它验证代码以避免运行时失败。验证成功后,JVM在操作系统的帮助下逐字节执行代码

  • 因此,整个java程序由JVM和操作系统执行。JVM充当java程序的迷你操作系统,它只在指令不在其范围内时才涉及操作系统。

    我建议您阅读:那么每个字节码指令都转换为机器代码?然后与操作系统通信,操作系统与cpu通信?是的,但JVM不参与,它必须由包装器环境完成,在本例中是JRE。将其视为运行批处理文件或shell脚本,批处理文件中的每条指令都是一条与字节码中的指令等效的指令。然而,解释器必须根据批处理文件中的每条指令找到合适的程序来运行。