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

Chr*_*s B 15 java performance 64-bit jvm

最近我一直在对我公司的数据库产品的写入性能做一些基准测试,我发现只需切换到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)
Run Code Online (Sandbox Code Playgroud)

两个JVM的常量:

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

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

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

直到现在我的直觉如下:

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

  • JVM使用一些花哨的指针压缩技巧来尽可能地缓解上述问题.在Sun网站的详细信息在这里.

  • 在64位模式下运行时,允许JVM使用更多寄存器,这会略微加快速度.

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

有任何想法吗?提前致谢.

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

Luc*_*lis 10

来自:http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_performance

"一般来说,能够满足更大容量的内存配备了64位虚拟机一个小的性能损耗与运行在32位虚拟机在同一应用程序的好处.这是由于系统中的每一个原生指针占用8个字节,而不是4,这些额外的数据的加载,对内存的使用取决于有多少指针Java程序的执行过程中得到加载它转换为稍慢的执行产生影响.好消息是AMD64和EM64T那在64位模式下运行的平台,Java虚拟机得到了一些额外的寄存器,它可以用它来生成更高效的原生指令序列.这些额外的寄存器提高性能的地方经常会有任何性能损失都比较32时到64点比特执行速度.
当你转移到64位虚拟机时,将64位平台上运行的应用程序与SPARC上的32位平台相比,性能差异大约为10-20%.在AMD64上 d EM64T平台的差异范围为0-15%,具体取决于访问应用程序的指针数量."


Kit*_*YMG 8

不知道你的硬件,我只是采取一些疯狂的刺

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