如何在java中解释字节码?

时间:2014-06-03 16:30:05

标签: java jvm

正如你从我的问题中猜到我是java的新手,我的问题是一个关于JVM工作的简单问题。我从维基百科研究过,字节码被提供给解释器或JIT编译器,并且由JVM根据底层平台的类型执行。我的问题是: -

  1. 术语“平台”是指硬件还是硬件和操作系统?
  2. 具有不同平台的两台设备是否有不同的JVM?

5 个答案:

答案 0 :(得分:2)

  

术语“平台”是指硬件还是硬件和操作系统?

硬件/ OS

  

具有不同平台的两个设备是否具有不同的JVM?

它们可能具有相同的JVM(按版本号),但这些JVM的实现将会有所不同。 JVM本身只是一个编译过的程序 - 两个二进制文件将是不同的。它们可能表现完全相同,但它们确实是不同的程序可执行文件。

答案 1 :(得分:2)

我建议您回到计算机工作原理的基础知识。在视觉上,堆栈看起来像这样;

----------------
Application
----------------
Operating System
----------------
Hardware
----------------

在堆栈的底部,你有硬件。这可以是任何架构 - x86,ARM,PowerPC ......等等。在此之上,您可以使用操作系统来处理面向用户的应用程序与底层硬件之间的交互。最重要的是,你有应用程序。

现在,假设您必须支持在多个硬件上运行的应用程序。对于每个平台(OS +硬件组合),您需要维护不同的应用程序源代码。像这样的东西;

----------------------       ||    ----------------------
Application (x86)            ||    Application (ARM)
----------------------       ||    ----------------------
Operating System (x86)       ||    Operating System (ARM)
----------------------       ||    ----------------------
Hardware (x86)               ||    Hardware (ARM)   
----------------------       ||    ----------------------

根据应用程序的复杂程度,这将成为维护的噩梦。 Java运行时环境(JRE)承诺“一次编码,随处运行”的理念。简单地说,他们像这样在堆栈中添加另一层;

---------------------------------------------------------
                       Application (Java)
---------------------------------------------------------
JRE (x86)                    ||    JRE (ARM)
----------------------       ||    ----------------------
Operating System (x86)       ||    Operating System (ARM)
----------------------       ||    ----------------------
Hardware (x86)               ||    Hardware (ARM)   
----------------------       ||    ----------------------

以这种方式做事意味着您无需担心应用程序将在何种硬件上运行。使事情变得更容易维护。

我喜欢认为我的ASCII艺术回答了你的问题?

答案 2 :(得分:1)

  

术语"平台"是指硬件还是硬件和操作系统?

是的,例如GNU / Linux JVM与Windows JVM位于不同的平台上。

  

具有不同平台的两个设备是否具有不同的JVM?

最有可能,例如ELF可执行文件不能在Windows上运行,它需要一个PE可执行文件。

在理想的世界中,只要您不使用任何特定于平台的功能,您就不应该关心代码运行的平台。甚至基本文件IO通常也需要特定于平台的代码。

答案 3 :(得分:1)

平台是指处理器架构和操作系统的组合,尽管OS / CPU的某些组合可能共享某些代码。

为了了解它如何在内部工作,为什么不把热点JVM的实现方式看作一个例子。源代码是here,你可以看到每个cpu的分支(对于cpu特定的代码),os(对于OS特定的代码),cpu_os(对于每个cpu / os组合改变的代码)和共享这是公共代码跨越CPU和操作系统。

您将看到,在热点的情况下,代码的很大一部分是跨平台共享的。

答案 4 :(得分:1)

JVM本身就是一个软件,可以为硬件和操作系统编写,JVM可以像手表一样低到汽车导航器的PDA,也可以像电视机那样复杂。

请参阅http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/