原文: https://howtodoinjava.com/java/basics/difference-between-32-bit-java-vs-64-bit-java/

在计算机架构中, 64 位计算是使用具有 64 位(8 个八位位组/字节)的数据路径宽度,整数大小和内存地址宽度的处理器。 同样,64 位 CPU 和 ALU 架构是基于该大小的寄存器,地址总线或数据总线的架构。 从软件的角度来看,64 位计算意味着使用具有 64 位虚拟内存地址的代码。 类似地, 32 位计算,CPU 或 32 位编程将 32 位(四个八位位组/字节)用于上述所有目的。

如果转到 java 下载页面,它会列出各种安装包,其中提及针对各种平台(例如 Linux 或 Windows)的 32 位包或 64 位包。很多时候,我们担心哪些包可以在系统中下载并安装,以使我们的 Java 代码正常运行? 在这篇文章中,我将尝试阐明这些不同的术语,并且还将尝试回答一些明显的问题。

  1. Discussion Points
  2. Understanding 32-bit architecture in detail
  3. How 64-bit architecture is different?
  4. Which versions of java you should install on 32-bit/64-bit machines?
  5. Can a .class file generated using a 32-bit java compiler be used on 64-bit java?
  6. What's maximum amount of RAM that will be allocated to java on a 32-bit machine vs. 64-bit machine?

您已经阅读了 64 位和 32 位计算/架构之间的基本区别。 现在,让我们加深理解,深入了解比特和字节。

详细了解 32 位架构

您可能已经知道,在任何 32 位操作系统中,都被限制为 4096 MB(4 GB)的 RAM 。 这很简单,因为 32 位值的大小将不允许在内存中添加更多引用。

2 ^ 32 = 4,294,967,296,即约 4.29 GB

因此,理论上,在 32 位系统中,每个进程最多可以分配 4GB 的内存。 在 Windows 上打破这一点的是如何处理进程地址空间。 Windows 将进程地址空间减少一半。 其中一半保留给操作系统(用户进程无法使用),另一半保留给用户。 盒中有多少 RAM 无关紧要,一个 32 位进程只能使用 2GB RAM。 更糟糕的是 – 地址空间必须是连续的,因此实际上,在 Windows 计算机上通常只剩下 1.5-1.8GB 的堆空间。

精通技术的读者可能知道,现代芯片支持 PAE ,这是一种处理器技术,它允许操作系统使用更多的内存(最大为 64 GB),但它也需要特殊的应用程序支持,大多数应用程序没有或不一定需要它。

Windows 的 4 GB 限制至少也是许可的因素。 32 位 Windows 的家庭版本在技术上能够支持 PAE,但出于许可和驱动程序兼容性方面的考虑,硬限制为 4 GB。 我要指出“ 驱动程序兼容性原因”,因为某些使用本地文件(例如防病毒软件)的特定应用程序是专门为 32 位/ 64 位计算机构建的,而本机文件不与其他机器兼容

要记住的另一件事是,您的 BIOS 和主板中的其他设备芯片(例如视频卡)也占用相同的 4 GB 空间中的一些内存,因此可供您的应用程序使用的实际内存进一步减少到大约 1.5 GB。

64 位架构有何不同?

虽然 32 位信息只能访问 4 GB 的 RAM,但至少在理论上, 64 位计算机可以访问 172 亿 GB 的系统内存。 因此,它必须消除系统中所有内存消耗的障碍,对吗? 但事实并非如此。

Windows 64 位家庭版仍然限制为 16 GB RAM(全部是出于许可原因),但是由于各种兼容性问题,专业版和旗舰版目前最多可以使用 192 GB RAM。

RAM 的每个进程限制也大大提高了 — 在 64 位 Windows 上,而不是 2 GB 限制,每个应用程序可以访问高达 8 TB 的虚拟内存,而无需任何特殊配置(必须存在于您的系统中)。 当考虑可能需要使用大量 RAM 的视频编辑或虚拟机等应用程序时,这是选择下一台计算机的重要因素。

因此,现在我们对 32 位计算机和 64 位计算机有了很好的了解。 让我们关注与 Java 主要相关的内容。

您应该在 32 位/ 64 位计算机上安装哪个版本的 Java?

严格来说,在 32 位 CPU 架构计算机上,应该安装 32 位 Java / JRE。 另一方面,在 64 位 CPU 架构计算机上,您可以自由选择在 32 位 Java / JRE 和 64 位 Java / JRE 之间。 两者都可以正常工作。 实际上,在 64 位计算机上,JRE 版本的决定取决于其他因素,例如在高负载情况下运行应用程序所需的最大内存。

请注意,高可用内存并非免费提供。 它确实会花费运行时间,例如

1)与 32 位相比,在 64 位上需要更多 30-50% 的堆。 为什么? 主要是由于 64 位架构中的内存布局。 首先 – 在 64 位 JVM 上,对象标头是 12 个字节。 其次,对象引用可以是 4 个字节,也可以是 8 个字节,具体取决于 JVM 标志和堆的大小。 与 32 位标头上的 8 个字节和引用标本上的 4 个字节相比,这无疑增加了一些开销。

2)较长的垃圾收集暂停。 建立更多的堆意味着 GC 在清除未使用的对象时还有更多工作要做。 在现实生活中,这意味着在构建大于 12-16GB 的堆时,您必须格外小心。 如果不进行微调和测量,则很容易在几分钟内引入完整的 GC 暂停,这可能会导致显示停止。

使用 32 位 Java 编译器生成的.class文件可以在 64 位 Java 上使用吗?

绝对是。 Java 字节码独立于 32 位或 64 位系统。这就是为什么编译的 Java 代码应在“任何”系统上可执行的原因。 请记住,因为虚拟机是打包在捆绑包中的一些本机文件,所以它只是为特殊的系统架构而编译的,而本机文件从不独立于平台。

如果是,那么 32 位应用程序如何在 64 位系统上运行?答案是 64 位系统包含一个称为 WoW64 的兼容层,实际上可以在 32 位和 64 位之间来回切换处理器的位模式,取决于需要执行的线程; 使 32 位软件即使在 64 位环境中也能平稳运行。

在 32 位计算机和 64 位计算机上,可分配给 Java 的最大 RAM 数量是多少?

我们已经在本文的前面的讨论中了解到两个版本都允许的限制。 在 64 位系统上,理论上对于今天可用的任何配置(172 亿 GB 内存),其限制都非常高。 供应商仍然出于各种目的施加限制,主要包括许可和与其他本机应用程序的兼容性。

同样,在 32 位计算机上,限制为 4 GB,出于上述原因,用户应用程序实际上仅可使用约 1.5 GB。

您可以使用 32 位窗口来减少内核空间并增加用户空间,这是一个技巧。 您可以在boot.ini中使用/3GB参数。 但是,要实际利用此机会,必须使用/LARGEADDRESSAWARE开关来编译/链接 JVM。

不幸的是,至少对于 Hotspot JVM 并非如此。 直到最新的 JDK 版本,才使用此选项编译 JVM。 如果您在 2006 年后版本的 jRockit 上运行,则更加幸运。 在这种情况下,您可以享受高达 2.8-2.9 GB 的堆大小。

仅此而已。 如果不清楚,请发表评论。 或者你只是不同意我。

祝您学习愉快!

参考: