2017-05-25 134 views
0

我很困惑,因为在JVM的角色。我的理解是正确的,JVM只将字节码转换为机器码?所以基本上,OS,JVM和CPU之间存在通信。我的假设是字节码被转换为机器码,然后由CPU处理。字节码是否必须转换为机器码?

+0

我建议你阅读:https://en.wikipedia.org/wiki/Java_virtual_machine – PSo

回答

0

JVM是一个虚拟机。

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

JVM是不同的,它的机器代码是bytecode。有些机器具有高级语言作为他们的机器代码。如果JVM要在硬件上运行,而不在主机OS上运行,那么期望硬件能够使用bytecode指令集。

但是,由于它在主机操作系统上运行,任何字节码指令在转换为机器码后都会传送到主机。在VMware/VirtualBox的情况下,这些软件会照顾它。在JVM的情况下,它由JRE完成。

+0

因此,每个字节码指令都转换为机器码?然后传达给OS和OS到CPU? – manojpotla

+0

是的,但JVM不参与,它必须由包装环境完成,在这种情况下JRE。把它想象成运行批处理文件或shell脚本,批处理文件中的每条指令都是一个与字节码中的指令相当的指令。但是解释器必须根据批处理文件中的每条指令找到适当的程序来运行。 – 11thdimension

0

JAVA是一种编译和解释语言,不仅仅是解释型语言。让我们一步一步执行它的程序。

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

因此,整个Java程序由JVM和OS执行。虽然JVM充当Java程序的小型操作系统,但它仅在指令不在其范围内时才涉及OS。

相关问题