为什么 64 位 JVM 比 32 位 JVM 快?

2022-09-03 13:25:27

最近,我一直在对我公司的数据库产品的写入性能进行一些基准测试,我发现只需切换到64位JVM就可以使性能持续提高20-30%。

我不允许详细介绍我们的产品,但基本上它是一个面向列的数据库,针对存储日志进行了优化。基准测试涉及向其提供几千兆字节的原始日志,并计算分析它们并将其作为结构化数据存储在数据库中所需的时间。CPU和I / O的处理都非常重,尽管很难说以什么比例。

有关设置的一些注意事项:

Processor: Xeon E5640 2.66GHz (4 core) x 2
RAM: 24GB
Disk: 7200rpm, no RAID
OS: RHEL 6 64bit
Filesystem: Ext4
JVMs: 1.6.0_21 (32bit), 1.6.0_23 (64bit)
Max heap size (-Xmx): 512 MB (for both 32bit and 64bit JVMs)

两个 JVM 的常量:

  • 相同的操作系统(64 位 RHEL)
  • 相同的硬件(64 位 CPU)
  • 最大堆大小固定为 512 MB(因此速度增加不是由于 64 位 JVM 使用更大的堆)

为简单起见,我关闭了产品中的所有多线程选项,因此几乎所有处理都以单线程方式进行。(当我打开多线程时,系统当然变得更快,但32位和64位之间的比率保持不变。

所以,我的问题是...为什么在使用 64 位 JVM 时,我能看到 20-30% 的速度提升?以前有人见过类似的结果吗?

到目前为止,我的直觉如下:

  • 64 位指针更大,因此 L1 和 L2 缓存更容易溢出,因此 64 位 JVM 的性能更差。

  • JVM使用一些花哨的指针压缩技巧来尽可能地缓解上述问题。有关太阳网站的详细信息,请单击此处

  • 在64位模式下运行时,允许JVM使用更多的寄存器,这稍微加快了速度。

鉴于上述三点,我预计64位性能会稍微慢一些,或者大约等于32位JVM。

有什么想法吗?提前致谢。

编辑:澄清了有关基准环境的一些要点。


答案 1

寄件人: http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_performance

“通常,与在 32 位 VM 上运行相同的应用程序相比,能够在 64 位 VM 中处理大量内存的好处会带来较小的性能损失。这是因为系统中的每个本机指针占用 8 个字节而不是 4 个字节。加载这些额外的数据会影响内存使用,这意味着执行速度会稍慢,具体取决于在执行 Java 程序期间加载的指针数。好消息是,随着 AMD64 和 EM64T 平台以 64 位模式运行,Java VM 获得了一些额外的寄存器,可用于生成更有效的本机指令序列。这些额外的寄存器将性能提高到在比较32位和64位执行速度时通常根本没有性能损失的程度。
在移动到 64 位 VM 时,在 SPARC 上运行的应用程序与在 SPARC 上运行的 32 位平台相比,性能差异大约是 10-20% 的降级。在 AMD64 和 EM64T 平台上,这种差异范围为 0-15%,具体取决于访问应用程序的指针执行量。


答案 2

在不了解您的硬件的情况下,我只是在疯狂地刺伤

  • 您的特定CPU可能正在使用微码来“模拟”某些x86指令 - 最着名的是x87 ISA
  • x64使用sse数学而不是x87数学,我注意到在这种情况下,一些数学密集型C++应用程序的加速速度为%10-%20。如果你使用.,数学差异可能是真正的杀手。strictfp
  • 记忆。64 位为您提供了更多的地址空间。也许GC在64位模式下不那么激进,因为你有额外的RAM。
  • 您的操作系统是否处于64b模式,并通过某些包装器实用程序运行32b jvm?

推荐