# 32 位 Java 与 64 位 Java 之间的区别

> 原文： [https://howtodoinjava.com/java/basics/difference-between-32-bit-java-vs-64-bit-java/](https://howtodoinjava.com/java/basics/difference-between-32-bit-java-vs-64-bit-java/)

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

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

```java
Discussion Points

Understanding 32-bit architecture in detail
How 64-bit architecture is different?
Which versions of java you should install on 32-bit/64-bit machines?
Can a .class file generated using a 32-bit java compiler be used on 64-bit java?
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**](https://en.wikipedia.org/wiki/Physical_Address_Extension "Physical Address Extension") ，这是一种处理器技术，它允许操作系统使用更多的内存（最大为 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**](https://en.wikipedia.org/wiki/WoW64 "WoW64") 的兼容层，实际上**可以在 32 位和 64 位之间来回切换处理器的位模式**，取决于需要执行的线程； 使 32 位软件即使在 64 位环境中也能平稳运行。

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

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

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

> 您可以使用 32 位窗口来减少内核空间并增加用户空间，这是一个技巧。 您可以在`boot.ini`中使用`/3GB`参数。 但是，要实际利用此机会，必须使用[**`/LARGEADDRESSAWARE`**](https://publib.boulder.ibm.com/infocenter/javasdk/v1r4m2/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.142%2Fhtml%2Fwinlargeaddress.html "LARGEADDRESSAWARE")开关来编译/链接 JVM。

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

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

**祝您学习愉快！**

**参考：**

*   [https://community.oracle.com/thread/2497016?tstart=0](https://community.oracle.com/thread/2497016?tstart=0)
*   [https://en.wikipedia.org/wiki/32-bit](https://en.wikipedia.org/wiki/32-bit)
*   [http://en.wikipedia.org/wiki/64-bit_computing](https://en.wikipedia.org/wiki/64-bit_computing)