为什么 64 位 JVM 比 32 位 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)
两个 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。
有什么想法吗?提前致谢。
编辑:澄清了有关基准环境的一些要点。