企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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)