Java平台独立性如何运作?

时间:2013-01-02 13:20:11

标签: java jvm bytecode

我在64位编译器上执行了一个java程序,并为该程序生成了字节代码。是否可以在32位编译器上运行相同的字节代码而不丢失数据?

在我的程序中,我在64位编译器上声明了变量x=10024? 那么32位编译器中x的值是多少?如果x的值相同,那么在没有数据丢失的情况下如何实现?你能详细说明吗?

7 个答案:

答案 0 :(得分:7)

当您运行“32位”编译器时,您正在32位JVM中运行编译器代码,并且当您运行“64位”编译器时,您运行的是64位完全相同的代码JVM将生成完全相同的字节代码。如果字节代码不完全相同,则表示您发现了一个错误。唯一的区别是“64位”版本的运行速度可能稍快一些(猜测时多达5%)

  

我在64位编译器上执行了一个java程序

您在编译器中编译字节代码,而不是运行它。

  

并生成该程序的字节代码。

字节代码不是32位或64位,并且创建它的方式或运行编译器的JVM没有区别。

  

是否可以在32位编译器上运行相同的字节代码而不会丢失数据?

无论是32位还是64位,您都可以使用任何版本的Java编译的代码编译代码,无论是32位还是64位。

  

在我的程序中,我在64位编译器上声明了一个变量x = 10024?

这没有任何意义。您可能使用在64位JVM中运行的编译器编译了int x=10024;之类的代码。如何编译没有任何区别。

  

那么32位编译器中x的值是多少?

与在32位JVM或任何其他JVM中运行的编译器相同。

  

如果x的值相同,如何在不丢失数据的情况下如何实现?

没有理由丢失数据。如果xint,则无论您如何编译代码或使用哪个JVM来运行编译器,它都将是32位有符号值。

答案 1 :(得分:6)

JVM保证字节码运行同样好,无论架构如何,无论是64位还是32位,无论是小端还是大端。在Java字节码中:

  • 所有原始类型都是相同的大小;
  • 都是大端。

之后,JVM 可能或者可能不会在运行时将字节码优化为本机代码(并在场景之外执行必要的字节序魔术)。

如果您愿意,可以将字节码视为“Java汇编语言” - 但是对于所有CPU架构只有一种这样的汇编语言:“运行”汇编语言是JVM的角色。

答案 2 :(得分:2)

Java编译器生成的字节码不依赖于物理机的体系结构。 Java虚拟机可以运行此字节代码,其架构与编译代码的机器的架构相同。

Java整数类型是4个字节。在32,64或128位机器上。 Java long类型是8个字节。等等等。

答案 3 :(得分:1)

是的,无论您的原始变量的平台值是否保持不变。除浮点数据类型外,精度取决于您是否指定了strictfp。

来自Java语言规范: Strictfp确保您在每个平台上获得与浮点计算完全相同的结果。如果您不使用strictfp,JVM实现可以在可用的情况下自由使用额外的精度

答案 4 :(得分:1)

fge是正确的。

更详细: Java确保了这一点 int在BigEndian中有4个字节 float在BigEndian中有4个字节 long在BE中有8个字节 等等...

无论底层架构如何,都会保持这种状态,因此在8位机器上使用long会严重降低速度,因为它必须在8x8位上工作一段时间。

但是,平台和体系结构特定的JVM将尽可能地优化它。

答案 5 :(得分:1)

生成的字节码与平台无关。如果在32位或64位机器上运行相同的字节码,它没有任何区别。在大多数情况下应该表现完全相同。

除非你有本机代码(为特定的arcitechture编译机器代码),否则你的代码在32位和64位JVM中运行同样好,即它是独立于平台的

x = 10024 

int变量x在两种体系结构中表示为32位定点值,因此不会有任何丢失或意外行为

答案 6 :(得分:0)

Java在可以执行代码的Java虚拟机(JVM)中运行。 JVM提供了一个运行时环境,可以在其中执行Java字节码,启用自动异常处理等功能,为每个软件错误(异常)提供根本原因调试信息。 JVM与Java类库一起分发,Java类库是一组实现Java应用程序编程接口(API)的标准类库(在Java字节码中)。这些库与JVM捆绑在一起,形成Java运行时环境(JRE)。 JVM可用于许多硬件和软件平台。在所有平台上对所有JVM使用相同的字节码允许将Java描述为一次编写,随处运行的编程语言,而不是一次编写,随处编译,这描述了跨平台编译语言。因此,JVM是Java平台的关键组件。 JVM通常被实现为在现有操作系统上运行,但也可以实现为直接在硬件上运行。如果你愿意,可以自己创建,允许你在任何地方移植java。资料来源:Wikipedia