除非开发性能关键的应用程序,否则不需要知道其中的区别。 32 位和 64 位 JVM 之间的细微差别对您的应用程序几乎没有影响。
现在我们将列出 32 位和 64 位Java虚拟机之间的一些主要差异,我们将根据以下让步因素对它们进行比较:
- 在 64 位 JVM 中,您可以为堆大小指定比 32 位 JVM 更多的内存;例如,在 32 位 JVM 中,理论上的最大内存限制是 4GB,而 64 位要高得多。
- 64 位 JVM 对于具有大堆的Java应用程序特别有用,例如那些最大使用超过 100 GB 内存的应用程序。
- 由于 OOP(普通对象指针)的大小从 32 位增加到 64 位,因此相同的Java应用程序在 64 位 JVM 中将使用比在 32 位 JVM 中更多的内存。如果您使用 JVM 选项 -XXCompressedOOP,您可以摆脱它,它告诉 JVM 使用 32 位指针。
- 下一个主要变化是在 64 位 JVM 架构中对象头的大小,现在是 12 字节,而不是 32 位 JVM 中的 8 字节。另一个变化是内部引用的大小,现在最多可以有 8 个字节,而 32 位 JVM 最多只能有 4 个字节。
- 32 位和 64 位 JVM 有一个单独的安装程序。
- 客户端 JVM 仅适用于 32 位 JVM,不适用于 64 位。
如上所述,我们已经看到了这些差异,但请记住关于 64 位 JVM 性能如何比 32 位 JVM 慢的注释?
这是因为系统中的每个本地指针占用八个字节而不是四个字节。加载这些额外数据会增加内存使用量,这会导致执行速度稍慢,具体取决于Java程序执行期间加载的指针数量。 Java虚拟机获得一些额外的寄存器,可用于创建更高效的本机指令序列。在比较 32 位和 64 位执行速度时,这些额外的寄存器将性能提高到通常完全没有性能损失的程度。
从 32 位 JVM 迁移到 64 位 JVM 时需要考虑以下几点:
- 垃圾收集器暂停时间
- 本地库
因素 1: GC 暂停时间
从 32 位切换到 64 位 JVM 的主要动机是增加堆大小(即 -Xmx)。当您增加堆大小时,您的 GC 暂停时间将自动增加,因为内存中没有更多垃圾需要清除。在执行迁移之前,您必须执行适当的 GC 调优;否则,您的应用程序可能会暂停几秒钟到几分钟。要为新增加的堆大小提供正确的 GC 设置,您可以使用 GCeasy 等工具。
因素 2:本地库
如果您的应用程序通过Java机接口 (JNI) 访问本机库,您还需要升级本机库,因为 32 位 JVM 只能使用 32 位本机库。同样,64 位 JVM 只能使用 64 位的本机库。
Note: When should I use a 32-bit or 64-bit Java virtual machine?
- If your application’s heap size (i.e. -Xmx) is less than 2GB, it’s a no-brainer. Use a 32-bit JVM. (< 2GB Memory)
- If your application requires more than 2GB of memory, it’s a no-brainer. Definitely go with 64-bit JVM (> 2GB memory)