Java 32位和64位

问题描述:

Java字节码是Java源代码编译的语言,而Java虚拟机可以识别的语言是 。与编译语言 必须针对每种不同类型的计算机专门编译不同, 只需要将Java程序转换为 之后的一个Java程序,它可以在Java虚拟机 所在的任何平台上运行。Java 32位和64位

我可以理解,一旦java被编译,类可以从任何机器运行,因为编译的类可以被任何机器理解。

我的问题是:为什么有两种类型的jdk呢? (x86,x64)

+0

由于底层架构不同:endianness,vendor等x86具有32位和64位版本,ARM也是如此,然后是SPARC,MiPS等等......不仅32bit vs 64bit – fge

+0

您的应用程序代码是可移植的,JVM不是。您需要针对您打算使用的每个硬件架构和操作系统进行实施。 –

+1

@assylias不完全相同的问题。 –

Java虚拟机本身就是需要在硬件架构和操作系统之上运行的应用程序,并且很可能它们不是用Java自己实现的。

这就是流行的Java HotSpot Virtual Machine(Oracle的默认实现)的情况,它主要在C/C++中实现。

这意味着您需要为其打算使用它的每个硬件体系结构和操作系统编译版本,因此这解释了32位和64位硬件体系结构的版本。

这也是其他JVM实现的情况,如JRockit,IBM J9,Azul Systems Zulu和可能的many others

Other helper programs不考虑Java虚拟机,通常包括程序员开发应用程序作为JDK(Java开发工具包)的一部分,也可以通过这种方式开发。这就是编译器(javac),文档生成器(javadoc),RMI编译器(rmic),Java反汇编器,(javap)等工具的情况。

因此,那些JDK工具还需要硬件依赖的实现。这就是为什么在下载JDK时为您提供选择的原因。

- 编辑 -

寻址的“便携性”主题

这取决于你的意思是“便携性”是什么的问题。如果您的意思是Java的WORA(只写一次,随处运行),那么它必须通过Java,Python或Ruby等虚拟机。但是像C/C++这样的语言编译为机器代码,因此它们不是通过虚拟机运行,而是通过硬件本身运行。这并不意味着它们不可移植,您可以按照可以在多种体系结构中运行的方式编写代码,只是您不能使用相同的二进制文件。您必须重新编译每个案例,因为程序必须以特定硬件/操作系统理解的方式编写/编译。

这个差距是虚拟机打算关闭的。

现在,可移植性可能意味着不仅仅是使用相同的二进制文件。即使Java中,你可以编写代码是不可移植的,也许是因为你是因为使用了文本,则误编程的路径(即Linux的/ VS的Windows \)使用依赖于操作系统的特性或等

+1

我爱列表;特别是带链接的列表。 +1 – NobleUplift

+0

为什么不认为ruby和python具有与java相同的属性?如果解释相同的代码将在所有平台上运行 – Bula

+1

@Bula是的,他们是。在Ruby的情况下,通常你会自己为自己的架构或[从其他地方获取二进制文件]构建它(http://rubyinstaller.org/)。并且[Python下载页面](http://www.python.org/downloads/)明确提供了替代方法来下载不同硬件体系结构的语言。 –

有两种以上的JDK。每种类型的JDK都是针对特定平台,Intel x86,x64,ARM等进行编译的。尽管它们是针对不同平台编写的,但它们的功能相同。所以需要很多类型,因为通常您不能在另一个平台上运行JDK(例如,您不能在x86上运行JDK for ARM)。

Java语言是可移植的,二进制需要让他们移动不是。例如,jvm和javac都是不可移植的。

如果使用java编写javac,它会太慢,并且如果在没有javac的情况下编写javac就会陷入鸡蛋和鸡蛋的情况 - 所以它通常是用c或C++编写的,因此它不是便携。

此外,jvm正在完成便携式字节码的翻译工作,并将其转换为您正在运行的特定机器的特定非可移植代码,因此它不能移植。

+0

实际上,'javac' **是用Java编写的; 'javac.exe'只是一个很小的包装器,它启动JVM并控制javac类的'main'方法。顺便说一下,大多数'C'编译器都是用'C'编写的,所以你应该看到,“鸡肉和鸡蛋的情况”是可以解决的。 – Holger

  1. 64位jdk的性能优于32位jdk,但它需要更多的内存。
  2. 32位应用程序只能在Windows*问2GiB的内存。